<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<link href="data:text/css;charset=utf-8,%2ErPartvisNetworkTooltipShowme%7B%20display%3A%20none%3B%0A%7D%0A%2ErPartvisNetworkTooltipShowhim%3Ahover%20%2ErPartvisNetworkTooltipShowme%7B%0Adisplay%20%3A%20block%3B%0A%7D%0Ahr%2ErPartvisNetwork%7B%0Amargin%3A%200%2E1em%20auto%3B%0A%7D%0A%2Evis%20%2Eoverlay%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A%200%3B%0Aleft%3A%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0A%0Az%2Dindex%3A%2010%3B%0A%7D%0A%2Evis%2Dactive%20%7B%0Abox%2Dshadow%3A%200%200%2010px%20%2386d5f8%3B%0A%7D%0A%0A%2Evis%20%5Bclass%2A%3D%22span%22%5D%20%7B%0Amin%2Dheight%3A%200%3B%0Awidth%3A%20auto%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%20%7B%0Aposition%3Arelative%3B%0Adisplay%3Ablock%3B%0Afloat%3Aleft%3B%0Afont%2Dsize%3A12px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Dwrapper%20%7B%0Adisplay%3Ablock%3B%0Awidth%3A700px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Dwrapper%3A%3Aafter%20%7B%0Aclear%3A%20both%3B%0Acontent%3A%20%22%22%3B%0Adisplay%3A%20block%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Doption%2Dcontainer%7B%0Adisplay%3Ablock%3B%0Awidth%3A495px%3B%0Abackground%2Dcolor%3A%20%23ffffff%3B%0Aborder%3A2px%20solid%20%23f7f8fa%3B%0Aborder%2Dradius%3A4px%3B%0Amargin%2Dtop%3A20px%3B%0Aleft%3A10px%3B%0Apadding%2Dleft%3A5px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dbutton%7B%0Adisplay%3Ablock%3B%0Awidth%3A495px%3B%0Aheight%3A25px%3B%0Avertical%2Dalign%3A%20middle%3B%0Aline%2Dheight%3A25px%3B%0Abackground%2Dcolor%3A%20%23f7f8fa%3B%0Aborder%3A2px%20solid%20%23ceced0%3B%0Aborder%2Dradius%3A4px%3B%0Amargin%2Dtop%3A20px%3B%0Aleft%3A10px%3B%0Apadding%2Dleft%3A5px%3B%0Acursor%3A%20pointer%3B%0Amargin%2Dbottom%3A30px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dbutton%2Ehover%7B%0Abackground%2Dcolor%3A%20%234588e6%3B%0Aborder%3A2px%20solid%20%23214373%3B%0Acolor%3A%23ffffff%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Ditem%7B%0Adisplay%3Ablock%3B%0Afloat%3Aleft%3B%0Awidth%3A495px%3B%0Aheight%3A25px%3B%0Avertical%2Dalign%3A%20middle%3B%0Aline%2Dheight%3A25px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Ditem%2Evis%2Dconfig%2Ds2%7B%0Aleft%3A10px%3B%0Abackground%2Dcolor%3A%20%23f7f8fa%3B%0Apadding%2Dleft%3A5px%3B%0Aborder%2Dradius%3A3px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Ditem%2Evis%2Dconfig%2Ds3%7B%0Aleft%3A20px%3B%0Abackground%2Dcolor%3A%20%23e4e9f0%3B%0Apadding%2Dleft%3A5px%3B%0Aborder%2Dradius%3A3px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Ditem%2Evis%2Dconfig%2Ds4%7B%0Aleft%3A30px%3B%0Abackground%2Dcolor%3A%20%23cfd8e6%3B%0Apadding%2Dleft%3A5px%3B%0Aborder%2Dradius%3A3px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dheader%7B%0Afont%2Dsize%3A18px%3B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dlabel%7B%0Awidth%3A120px%3B%0Aheight%3A25px%3B%0Aline%2Dheight%3A%2025px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dlabel%2Evis%2Dconfig%2Ds3%7B%0Awidth%3A110px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dlabel%2Evis%2Dconfig%2Ds4%7B%0Awidth%3A100px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2DcolorBlock%7B%0Atop%3A1px%3B%0Awidth%3A30px%3B%0Aheight%3A19px%3B%0Aborder%3A1px%20solid%20%23444444%3B%0Aborder%2Dradius%3A2px%3B%0Apadding%3A0px%3B%0Amargin%3A0px%3B%0Acursor%3Apointer%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dcheckbox%20%7B%0Aleft%3A%2D5px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drangeinput%7B%0Aposition%3Arelative%3B%0Atop%3A%2D5px%3B%0Awidth%3A60px%3B%0A%0Apadding%3A1px%3B%0Amargin%3A0%3B%0Apointer%2Devents%3Anone%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%7B%0A%0A%2Dwebkit%2Dappearance%3A%20none%3B%0A%0Aborder%3A%200px%20solid%20white%3B%0Abackground%2Dcolor%3Argba%280%2C0%2C0%2C0%29%3B%0A%0Awidth%3A%20300px%3B%0Aheight%3A20px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dwebkit%2Dslider%2Drunnable%2Dtrack%20%7B%0Awidth%3A%20300px%3B%0Aheight%3A%205px%3B%0Abackground%3A%20%23dedede%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%20%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%23dedede%29%2C%20color%2Dstop%2899%25%2C%23c8c8c8%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%20%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%23dedede%27%2C%20endColorstr%3D%27%23c8c8c8%27%2CGradientType%3D0%20%29%3B%20%0Aborder%3A%201px%20solid%20%23999999%3B%0Abox%2Dshadow%3A%20%23aaaaaa%200px%200px%203px%200px%3B%0Aborder%2Dradius%3A%203px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dwebkit%2Dslider%2Dthumb%20%7B%0A%2Dwebkit%2Dappearance%3A%20none%3B%0Aborder%3A%201px%20solid%20%2314334b%3B%0Aheight%3A%2017px%3B%0Awidth%3A%2017px%3B%0Aborder%2Dradius%3A%2050%25%3B%0Abackground%3A%20%233876c2%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%233876c2%200%25%2C%20%23385380%20100%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%233876c2%29%2C%20color%2Dstop%28100%25%2C%23385380%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%233876c2%200%25%2C%23385380%20100%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%233876c2%200%25%2C%23385380%20100%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%233876c2%200%25%2C%23385380%20100%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%233876c2%200%25%2C%23385380%20100%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%233876c2%27%2C%20endColorstr%3D%27%23385380%27%2CGradientType%3D0%20%29%3B%20%0Abox%2Dshadow%3A%20%23111927%200px%200px%201px%200px%3B%0Amargin%2Dtop%3A%20%2D7px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3Afocus%20%7B%0Aoutline%3A%20none%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3Afocus%3A%3A%2Dwebkit%2Dslider%2Drunnable%2Dtrack%20%7B%0Abackground%3A%20%239d9d9d%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%239d9d9d%200%25%2C%20%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%239d9d9d%29%2C%20color%2Dstop%2899%25%2C%23c8c8c8%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%239d9d9d%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%239d9d9d%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%239d9d9d%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%239d9d9d%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%239d9d9d%27%2C%20endColorstr%3D%27%23c8c8c8%27%2CGradientType%3D0%20%29%3B%20%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dmoz%2Drange%2Dtrack%20%7B%0Awidth%3A%20300px%3B%0Aheight%3A%2010px%3B%0Abackground%3A%20%23dedede%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%20%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%23dedede%29%2C%20color%2Dstop%2899%25%2C%23c8c8c8%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%20%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%23dedede%27%2C%20endColorstr%3D%27%23c8c8c8%27%2CGradientType%3D0%20%29%3B%20%0Aborder%3A%201px%20solid%20%23999999%3B%0Abox%2Dshadow%3A%20%23aaaaaa%200px%200px%203px%200px%3B%0Aborder%2Dradius%3A%203px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dmoz%2Drange%2Dthumb%20%7B%0Aborder%3A%20none%3B%0Aheight%3A%2016px%3B%0Awidth%3A%2016px%3B%0Aborder%2Dradius%3A%2050%25%3B%0Abackground%3A%20%23385380%3B%0A%7D%0A%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%2Dmoz%2Dfocusring%7B%0Aoutline%3A%201px%20solid%20white%3B%0Aoutline%2Doffset%3A%20%2D1px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dms%2Dtrack%20%7B%0Awidth%3A%20300px%3B%0Aheight%3A%205px%3B%0A%0Abackground%3A%20transparent%3B%0A%0Aborder%2Dcolor%3A%20transparent%3B%0Aborder%2Dwidth%3A%206px%200%3B%0A%0Acolor%3A%20transparent%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dms%2Dfill%2Dlower%20%7B%0Abackground%3A%20%23777%3B%0Aborder%2Dradius%3A%2010px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dms%2Dfill%2Dupper%20%7B%0Abackground%3A%20%23ddd%3B%0Aborder%2Dradius%3A%2010px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dms%2Dthumb%20%7B%0Aborder%3A%20none%3B%0Aheight%3A%2016px%3B%0Awidth%3A%2016px%3B%0Aborder%2Dradius%3A%2050%25%3B%0Abackground%3A%20%23385380%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3Afocus%3A%3A%2Dms%2Dfill%2Dlower%20%7B%0Abackground%3A%20%23888%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3Afocus%3A%3A%2Dms%2Dfill%2Dupper%20%7B%0Abackground%3A%20%23ccc%3B%0A%7D%0A%2Evis%2Dconfiguration%2Dpopup%20%7B%0Aposition%3A%20absolute%3B%0Abackground%3A%20rgba%2857%2C%2076%2C%2089%2C%200%2E85%29%3B%0Aborder%3A%202px%20solid%20%23f2faff%3B%0Aline%2Dheight%3A30px%3B%0Aheight%3A30px%3B%0Awidth%3A150px%3B%0Atext%2Dalign%3Acenter%3B%0Acolor%3A%20%23ffffff%3B%0Afont%2Dsize%3A14px%3B%0Aborder%2Dradius%3A4px%3B%0A%2Dwebkit%2Dtransition%3A%20opacity%200%2E3s%20ease%2Din%2Dout%3B%0A%2Dmoz%2Dtransition%3A%20opacity%200%2E3s%20ease%2Din%2Dout%3B%0Atransition%3A%20opacity%200%2E3s%20ease%2Din%2Dout%3B%0A%7D%0A%2Evis%2Dconfiguration%2Dpopup%3Aafter%2C%20%2Evis%2Dconfiguration%2Dpopup%3Abefore%20%7B%0Aleft%3A%20100%25%3B%0Atop%3A%2050%25%3B%0Aborder%3A%20solid%20transparent%3B%0Acontent%3A%20%22%20%22%3B%0Aheight%3A%200%3B%0Awidth%3A%200%3B%0Aposition%3A%20absolute%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Evis%2Dconfiguration%2Dpopup%3Aafter%20%7B%0Aborder%2Dcolor%3A%20rgba%28136%2C%20183%2C%20213%2C%200%29%3B%0Aborder%2Dleft%2Dcolor%3A%20rgba%2857%2C%2076%2C%2089%2C%200%2E85%29%3B%0Aborder%2Dwidth%3A%208px%3B%0Amargin%2Dtop%3A%20%2D8px%3B%0A%7D%0A%2Evis%2Dconfiguration%2Dpopup%3Abefore%20%7B%0Aborder%2Dcolor%3A%20rgba%28194%2C%20225%2C%20245%2C%200%29%3B%0Aborder%2Dleft%2Dcolor%3A%20%23f2faff%3B%0Aborder%2Dwidth%3A%2012px%3B%0Amargin%2Dtop%3A%20%2D12px%3B%0A%7D%0A%0Adiv%2Evis%2Dcolor%2Dpicker%20%7B%0Aposition%3Aabsolute%3B%0Atop%3A%200px%3B%0Aleft%3A%2030px%3B%0Amargin%2Dtop%3A%2D140px%3B%0Amargin%2Dleft%3A30px%3B%0Awidth%3A310px%3B%0Aheight%3A444px%3B%0Az%2Dindex%3A%201%3B%0Apadding%3A%2010px%3B%0Aborder%2Dradius%3A15px%3B%0Abackground%2Dcolor%3A%23ffffff%3B%0Adisplay%3A%20none%3B%0Abox%2Dshadow%3A%20rgba%280%2C0%2C0%2C0%2E5%29%200px%200px%2010px%200px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Darrow%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A147px%3B%0Aleft%3A5px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Darrow%3A%3Aafter%2C%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Darrow%3A%3Abefore%20%7B%0Aright%3A%20100%25%3B%0Atop%3A%2050%25%3B%0Aborder%3A%20solid%20transparent%3B%0Acontent%3A%20%22%20%22%3B%0Aheight%3A%200%3B%0Awidth%3A%200%3B%0Aposition%3A%20absolute%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Darrow%3Aafter%20%7B%0Aborder%2Dcolor%3A%20rgba%28255%2C%20255%2C%20255%2C%200%29%3B%0Aborder%2Dright%2Dcolor%3A%20%23ffffff%3B%0Aborder%2Dwidth%3A%2030px%3B%0Amargin%2Dtop%3A%20%2D30px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dcolor%20%7B%0Aposition%3Aabsolute%3B%0Awidth%3A%20289px%3B%0Aheight%3A%20289px%3B%0Acursor%3A%20pointer%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbrightness%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A313px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dopacity%20%7B%0Aposition%3Aabsolute%3B%0Atop%3A350px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dselector%20%7B%0Aposition%3Aabsolute%3B%0Atop%3A137px%3B%0Aleft%3A137px%3B%0Awidth%3A15px%3B%0Aheight%3A15px%3B%0Aborder%2Dradius%3A15px%3B%0Aborder%3A1px%20solid%20%23ffffff%3B%0Abackground%3A%20%234c4c4c%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%234c4c4c%200%25%2C%20%23595959%2012%25%2C%20%23666666%2025%25%2C%20%23474747%2039%25%2C%20%232c2c2c%2050%25%2C%20%23000000%2051%25%2C%20%23111111%2060%25%2C%20%232b2b2b%2076%25%2C%20%231c1c1c%2091%25%2C%20%23131313%20100%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%234c4c4c%29%2C%20color%2Dstop%2812%25%2C%23595959%29%2C%20color%2Dstop%2825%25%2C%23666666%29%2C%20color%2Dstop%2839%25%2C%23474747%29%2C%20color%2Dstop%2850%25%2C%232c2c2c%29%2C%20color%2Dstop%2851%25%2C%23000000%29%2C%20color%2Dstop%2860%25%2C%23111111%29%2C%20color%2Dstop%2876%25%2C%232b2b2b%29%2C%20color%2Dstop%2891%25%2C%231c1c1c%29%2C%20color%2Dstop%28100%25%2C%23131313%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%234c4c4c%200%25%2C%23595959%2012%25%2C%23666666%2025%25%2C%23474747%2039%25%2C%232c2c2c%2050%25%2C%23000000%2051%25%2C%23111111%2060%25%2C%232b2b2b%2076%25%2C%231c1c1c%2091%25%2C%23131313%20100%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%234c4c4c%200%25%2C%23595959%2012%25%2C%23666666%2025%25%2C%23474747%2039%25%2C%232c2c2c%2050%25%2C%23000000%2051%25%2C%23111111%2060%25%2C%232b2b2b%2076%25%2C%231c1c1c%2091%25%2C%23131313%20100%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%234c4c4c%200%25%2C%23595959%2012%25%2C%23666666%2025%25%2C%23474747%2039%25%2C%232c2c2c%2050%25%2C%23000000%2051%25%2C%23111111%2060%25%2C%232b2b2b%2076%25%2C%231c1c1c%2091%25%2C%23131313%20100%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%234c4c4c%200%25%2C%23595959%2012%25%2C%23666666%2025%25%2C%23474747%2039%25%2C%232c2c2c%2050%25%2C%23000000%2051%25%2C%23111111%2060%25%2C%232b2b2b%2076%25%2C%231c1c1c%2091%25%2C%23131313%20100%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%234c4c4c%27%2C%20endColorstr%3D%27%23131313%27%2CGradientType%3D0%20%29%3B%20%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dnew%2Dcolor%20%7B%0Aposition%3Aabsolute%3B%0Awidth%3A140px%3B%0Aheight%3A20px%3B%0Aborder%3A1px%20solid%20rgba%280%2C0%2C0%2C0%2E1%29%3B%0Aborder%2Dradius%3A5px%3B%0Atop%3A380px%3B%0Aleft%3A159px%3B%0Atext%2Dalign%3Aright%3B%0Apadding%2Dright%3A2px%3B%0Afont%2Dsize%3A10px%3B%0Acolor%3Argba%280%2C0%2C0%2C0%2E4%29%3B%0Avertical%2Dalign%3Amiddle%3B%0Aline%2Dheight%3A20px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dinitial%2Dcolor%20%7B%0Aposition%3Aabsolute%3B%0Awidth%3A140px%3B%0Aheight%3A20px%3B%0Aborder%3A1px%20solid%20rgba%280%2C0%2C0%2C0%2E1%29%3B%0Aborder%2Dradius%3A5px%3B%0Atop%3A380px%3B%0Aleft%3A10px%3B%0Atext%2Dalign%3Aleft%3B%0Apadding%2Dleft%3A2px%3B%0Afont%2Dsize%3A10px%3B%0Acolor%3Argba%280%2C0%2C0%2C0%2E4%29%3B%0Avertical%2Dalign%3Amiddle%3B%0Aline%2Dheight%3A20px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dlabel%20%7B%0Aposition%3Aabsolute%3B%0Awidth%3A300px%3B%0Aleft%3A10px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dlabel%2Evis%2Dbrightness%20%7B%0Atop%3A300px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dlabel%2Evis%2Dopacity%20%7B%0Atop%3A338px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbutton%20%7B%0Aposition%3Aabsolute%3B%0Awidth%3A68px%3B%0Aheight%3A25px%3B%0Aborder%2Dradius%3A10px%3B%0Avertical%2Dalign%3A%20middle%3B%0Atext%2Dalign%3Acenter%3B%0Aline%2Dheight%3A%2025px%3B%0Atop%3A410px%3B%0Aborder%3A2px%20solid%20%23d9d9d9%3B%0Abackground%2Dcolor%3A%20%23f7f7f7%3B%0Acursor%3Apointer%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbutton%2Evis%2Dcancel%20%7B%0A%0A%0Aleft%3A5px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbutton%2Evis%2Dload%20%7B%0A%0A%0Aleft%3A82px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbutton%2Evis%2Dapply%20%7B%0A%0A%0Aleft%3A159px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbutton%2Evis%2Dsave%20%7B%0A%0A%0Aleft%3A236px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20input%2Evis%2Drange%20%7B%0Awidth%3A%20290px%3B%0Aheight%3A20px%3B%0A%7D%0A%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20%7B%0Abox%2Dsizing%3A%20content%2Dbox%3B%0Aborder%2Dwidth%3A%200%3B%0Aborder%2Dbottom%3A%201px%3B%0Aborder%2Dstyle%3Asolid%3B%0Aborder%2Dcolor%3A%20%23d6d9d8%3B%0Abackground%3A%20%23ffffff%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%23ffffff%200%25%2C%20%23fcfcfc%2048%25%2C%20%23fafafa%2050%25%2C%20%23fcfcfc%20100%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%23ffffff%29%2C%20color%2Dstop%2848%25%2C%23fcfcfc%29%2C%20color%2Dstop%2850%25%2C%23fafafa%29%2C%20color%2Dstop%28100%25%2C%23fcfcfc%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%23ffffff%200%25%2C%23fcfcfc%2048%25%2C%23fafafa%2050%25%2C%23fcfcfc%20100%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%23ffffff%200%25%2C%23fcfcfc%2048%25%2C%23fafafa%2050%25%2C%23fcfcfc%20100%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%23ffffff%200%25%2C%23fcfcfc%2048%25%2C%23fafafa%2050%25%2C%23fcfcfc%20100%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%23ffffff%200%25%2C%23fcfcfc%2048%25%2C%23fafafa%2050%25%2C%23fcfcfc%20100%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%23ffffff%27%2C%20endColorstr%3D%27%23fcfcfc%27%2CGradientType%3D0%20%29%3B%20%0Apadding%2Dtop%3A4px%3B%0Aposition%3A%20absolute%3B%0Aleft%3A%200%3B%0Atop%3A%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%2028px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dedit%2Dmode%20%7B%0Aposition%3Aabsolute%3B%0Aleft%3A%200%3B%0Atop%3A%205px%3B%0Aheight%3A%2030px%3B%0A%7D%0A%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dclose%20%7B%0Aposition%3Aabsolute%3B%0Aright%3A%200%3B%0Atop%3A%200%3B%0Awidth%3A%2030px%3B%0Aheight%3A%2030px%3B%0Abackground%2Dposition%3A%2020px%203px%3B%0Abackground%2Drepeat%3A%20no%2Drepeat%3B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAADvGaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTQtMDItMTRUMTE6NTU6MzUrMDE6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE0LTAyLTE0VDEyOjA1OjE3KzAxOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU%2BMjAxNC0wMi0xNFQxMjowNToxNyswMTowMDwveG1wOk1vZGlmeURhdGU%2BCiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NjU0YmM5YmQtMWI2Yi1jYjRhLTllOWQtNWY2MzgxNDVjZjk0PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjk4MmM2MGIwLWUzZjMtMDk0MC04MjU0LTFiZTliNWE0ZTE4MzwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjk4MmM2MGIwLWUzZjMtMDk0MC04MjU0LTFiZTliNWE0ZTE4MzwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDo5ODJjNjBiMC1lM2YzLTA5NDAtODI1NC0xYmU5YjVhNGUxODM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMTRUMTE6NTU6MzUrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjIxODYxNmM2LTM1MWMtNDI0OS04YWFkLWJkZDQ2ZTczNWE0NDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0xNFQxMTo1NTozNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NjU0YmM5YmQtMWI2Yi1jYjRhLTllOWQtNWY2MzgxNDVjZjk0PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAyLTE0VDEyOjA1OjE3KzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk%2BCiAgICAgICAgIDxkYzpmb3JtYXQ%2BaW1hZ2UvcG5nPC9kYzpmb3JtYXQ%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjc8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24%2BNzwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2BcZUZMwAAACBjSFJNAAB6JQAAgIMAAPn%2FAACA6QAAdTAAAOpgAAA6mAAAF2%2BSX8VGAAAA2ElEQVR42gDLADT%2FAS0tLUQFBQUVFxcXtPHx8fPl5eUNCAgITCkpKesEHx8fGgYGBjH%2B%2Fv4a%2BPj4qgQEBFU6OjodMTExzwQUFBSvEBAQEfX19SD19fVqNDQ0CElJSd%2F9%2Ff2vAwEBAfrn5%2BfkBwcHLRYWFgsXFxfz29vbo9LS0uwDDQ0NDfPz81orKysXIyMj%2BODg4Avh4eEa%2Ff391gMkJCRYPz8%2FKUhISOMCAgKh8fHxHRsbGx4UFBQQBDk5OeY7Ozv7CAgItPb29vMEBASaJSUlTQ0NDesDAEwpT0Ko8Ri2AAAAAElFTkSuQmCC%29%3B%0Acursor%3A%20pointer%3B%0A%2Dwebkit%2Dtouch%2Dcallout%3A%20none%3B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dkhtml%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%2Dms%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dclose%3Ahover%20%7B%0Aopacity%3A%200%2E6%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2C%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dedit%2Dmode%20div%2Evis%2Dbutton%20%7B%0Afloat%3Aleft%3B%0Afont%2Dfamily%3A%20verdana%3B%0Afont%2Dsize%3A%2012px%3B%0A%2Dmoz%2Dborder%2Dradius%3A%2015px%3B%0Aborder%2Dradius%3A%2015px%3B%0Adisplay%3Ainline%2Dblock%3B%0Abackground%2Dposition%3A%200px%200px%3B%0Abackground%2Drepeat%3Ano%2Drepeat%3B%0Aheight%3A24px%3B%0Amargin%2Dleft%3A%2010px%3B%0A%0Acursor%3A%20pointer%3B%0Apadding%3A%200px%208px%200px%208px%3B%0A%2Dwebkit%2Dtouch%2Dcallout%3A%20none%3B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dkhtml%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%2Dms%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%3Ahover%20%7B%0Abox%2Dshadow%3A%201px%201px%208px%20rgba%280%2C%200%2C%200%2C%200%2E20%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%3Aactive%20%7B%0Abox%2Dshadow%3A%201px%201px%208px%20rgba%280%2C%200%2C%200%2C%200%2E50%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dback%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w%2BCiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU%2BMjAxNC0wMi0wNFQxNTowMTowOSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTU6MDE6MDkrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOmI2YjQwMjVkLTAxNjQtMzU0OC1hOTdlLTQ4ZmYxMWM3NTYzMzwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2BY3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2Bc2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDpmOWQ3OGY4ZC1lNzY0LTc1NDgtODZiNy1iNmQ1OGMzZDg2OTc8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTU6MDE6MDkrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOmI2YjQwMjVkLTAxNjQtMzU0OC1hOTdlLTQ4ZmYxMWM3NTYzMzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0wNFQxNTowMTowOSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOmY5ZDc4ZjhkLWU3NjQtNzU0OC04NmI3LWI2ZDU4YzNkODY5Nzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24%2BCiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE%2BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw%2FeHBhY2tldCBlbmQ9InciPz4jq1U%2FAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAVTSURBVHjanFVfTFNnFP%2Bd77ve8qeVFbBrpcVgRrCRFikFByLxwSAaE32oRCHD6JMxxhhn8G2RxxH3MsOTbyYsmCAxPMmMMYtkIUYmK60OO0qAK23BFlNob0uh3x7WS5jLZPpLbm6%2Bk%2FP9zrm5v9855PF4UFhYCABgjIExBgAgIqRSqRIi6gDQRkQ1RGTB3wgR0e8AHgH4Sa%2FXR%2FEBiAiJRAJ04cIF5Ofng4g2n0gkUkxENwF0c843LzHGQEQQQkCLExEA9ALotVgsUQAQQmgNQhJCbF5kjCEUCl0moj4t5na7fTU1NUpVVVXUYrEkASAcDhe8efOmxOfzWScmJqoBdBNR99LS0hWz2dynNSSEAF28eBGFhYVgjCEcDn9HRD1EhIMHD3o9Hs9kWVlZAh9BKBQqGB4edr58%2BdKZ%2B6JbJpOpBwBWV1fB6%2BrqIMsyIpHIFcZYL2MMra2tY5cuXRrfuXNnBtvAYDBk3G63oqpqZm5uzgrgSDKZjBoMhueZTAbc5XIhFouVEtFTxhiOHTs2dv78eS8%2BEfv374%2BoqpqZnZ21cs5PJJPJPlmWkyynnBuMMTQ0NHi7uro%2BmVyDx%2BPxulwu71ZOlkqlSonoJhGhvb39s8k1nDx50ss5hyRJN9PpdKlERB2aWjSVaEilUvzBgwcORVEs5eXloXPnzk1sV8BkMiUdDofP7%2FdXZ7PZDilnIhw4cGBeS1pbW2P37t1zBwKBikQiUUREWFhYsHHO0d7evm0Ru90%2B%2F%2BrVq2rO%2BXGJiJxEhMrKyhgAjI6OWoeHh5tWVla%2B4JzDZrO9bW5unhwcHGzz%2B%2F32np4e%2BxaDbfoHAMxmc6ijo2O0oqIiJkkSNjY2HBIRmRljMJvNyWfPnln7%2B%2FtPMMZQXl6%2B0NbW9qK2tjYcj8floaEhqKpq%2BHCkbD3PzMwYBgYG0NXV9UuusFna2kEgELAQEQ4dOvSis7PzN41Ar9dnrl27NqCNkv%2FC3bt3zy4tLVmICJxzEBFJRBQmorLFxcWCqqqq0Pj4eO3Y2JhbUZTdra2tL2pra8OJRGLHnTt3zkqS9K%2BhuHU4EhHMZnMoGo0W5OIh7nK5jjLGKq1W69vDhw8rRqMxMjc3t2t5eXnX5ORklc%2FnM%2Bfl5SWnpqa%2B0uv1K%2Fn5%2BWs6nW5NluXNd15e3ppOp1uz2WyzZ86cGQ0Gg6ZAIFCZzWZ%2FlYjokRDiuN%2Fvt7W0tMw3NTUpbrd78P79%2B%2B5gMFgRiUTKHj58WMYYQ3V19etTp05tq6Lp6Wkb5xxCiEfc7XZPM8a6FxcXTfX19a%2F1en2Gcy5qamreNjY2%2FqGq6joRZe12%2B9Tp06e3JY%2FFYgWPHz8%2Bmhvr3%2FCWlpbk%2Bvp6PmOseWVlBS6XS9GSJUkSdrs93NDQ8Oe%2BffvC%2F8fJIyMjddFo9Esi6pVleVjT2m0A8Hq9zqGhIefnjoknT544A4GAM%2FeDbxMReFNTE0pKSpKqqsaI6Pj8%2FLxVVdWM3W6PfCr5xMTE1zllXS0uLn6aSqXAGxsbodPpoNfrn6uqCs75EUVRrJFIZMfevXsXdTrdxseIE4mEPDIyUu%2F3%2B%2Btynd8yGo29RIR0Og26fv06ioqKwBgD5xzv3r27zBjrIyJIkgSHwzFZWVmp7NmzJ1ZaWpoAgGg0WqgoSvHMzIw1GAw6tvjhitFo7NPW5fv370Hd3d0oKCgA53zTQMvLy%2BVCiKuSJH0rSdLmztZytIWv5RPRD0T0Y3Fx8dzWfby6ugopHo%2F%2Fw4mcc8iyPMc5v5FOp7%2FPZrOdQohWInIC2C2EgBBigYi8Qoifs9lsv06nWyIiaFxagXg8jr8GAGxuIe7LBeWhAAAAAElFTkSuQmCC%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dnone%3Ahover%20%7B%0Abox%2Dshadow%3A%201px%201px%208px%20rgba%280%2C%200%2C%200%2C%200%2E0%29%3B%0Acursor%3A%20default%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dnone%3Aactive%20%7B%0Abox%2Dshadow%3A%201px%201px%208px%20rgba%280%2C%200%2C%200%2C%200%2E0%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dnone%20%7B%0Apadding%3A%200%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Enotification%20%7B%0Amargin%3A%202px%3B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dadd%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w%2BCiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU%2BMjAxNC0wMi0wNFQxNDo0MDoyOSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6NDA6MjkrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjVkNWIwNmQwLTVmMjAtOGE0NC1hMzIwLWZmMTEzMzQwNDc0YjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2BY3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2Bc2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDo2OWVmYWE1NS01ZTI5LTIzNGUtYTUzMy0xNDkxYjM1NDNmYmE8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6NDA6MjkrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjVkNWIwNmQwLTVmMjAtOGE0NC1hMzIwLWZmMTEzMzQwNDc0Yjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0wNFQxNDo0MDoyOSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjY5ZWZhYTU1LTVlMjktMjM0ZS1hNTMzLTE0OTFiMzU0M2ZiYTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24%2BCiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE%2BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw%2FeHBhY2tldCBlbmQ9InciPz5WKqp9AAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYXSURBVHjafFZtUFTXGX7e9z27sveuMCwYV8ElrA7YSFYHtJUPkaaI0aRqG8wP00zUzljDINNSA%2F2ROtpO24SxnahlxjYd7SSjmUkymcxYlDhQPzHGisEVp8HwYWCVVVgEsrsuLnL74%2B5uqTF9Z%2B7cO%2Fd8PO95zvO851BlZSV0XQcAMDOYGQBARDhX3JRmMDYZwLPMWAzGHACYIgwS46oBNBNwtOL8CwE8EkSEUCgE2rJlC2w2G4go8Zwo%2FbMDgnoG6gxLfAAAYvPDMCCszKTAMIAGAhrWnf15AAAMwwARIRKJgDZv3gy73Q4iAjPjxIr9VVOMRhbAYKB8zvrO0llrfEsdKwLZek6YAPSFvtSu3GtLawu0ZJ6625SHGBQB1T88t6MxvopgMAjaunUrdF0HM%2BP4yv27DMYeJmB1RqW3Jnf3tQX2p0L4P9EXuqEd7PmDp%2BXuMU9sRbvXnnt1TxxACgoKYLVacbzsQDUJGkSATe6qi28uPtzusM6Kxie6NHLGUX3lxVUNX9StPHnn4wy3njuUYcu6n2pNi66avcEXnByP%2Fnv8aiaIyrqz2gO5A9%2B9FI1GIfn5%2BWhZdTAdjFMkwMvZOy7uWnTAOz3L4Yk71m3t69fdfTDoUGTBeHTUfiHQ6lo7Z2OXJvpDAChKe%2BaOCdKRKWxZ2%2B1qb3yyd3GYmRkQ7GQBVs99wfv6on3eR2k4PdTkDEbH7IuS8%2Fsvld%2F561PJS%2FpDk1%2Fbzwx94pze7xc5v%2FH%2BYPY6r5BAkdrJzODTK46lE6PeYEJt7u%2B8j%2BOZwCBiEAgAoNgKJoEQf6PvNvdrXgtZoNhSf7q0KZ3B2AQmVMze0Jmt54S%2FDcDCVig2NcvEUGxJAE4Pl%2BYOr0iv6BRSIPAmBeBZAmHlE2sH4p1uhrq1s0MnnEQMBsf8wRASAICQQCCITN1X7%2FsOuc0kgOVp3%2FfPs2WHv%2BcoG7gQOJUnLGsUCTxEjPzUohEA%2BNfIWUdtx0%2BefzA1kSSkIGyBAQNCKgHAEBAJ3u79U7kiAcWoem%2Fgb5Fd33nrH3kp%2BSMWtuAB%2BGllMJxMjCx9QRgA3uiqL5kwHiTlpxb3smlfMDGYGPP1hcMAkJvs8ScpfdJspdj%2BMK6Pf%2B5%2Bu29vyb4lR4%2BBGEziVESAkEpw6Av1OhUpHCz4qOXbzFWz4Ncdj%2Fv%2Fo08Lt92ODDgZDCEFJYoUGH4mzugP92puPTf0pD3H7wvfdFZdqSxnMtWjoGAAmG9fOLxjwesdjT2%2FXzIQ7ks3sycYMSEwGHNtWf5bkX5NkYCJBxUBXiGV0XHvosOt54Zey33j%2FK%2B8P33%2B%2BvjnbiGJbbLE%2BJ9SANAb6nJ2B79wcUwETAwQQ7fMjPzMvfP8ja87HUIKMOiaAqMZhrGmLdAy78eZrwwsTS0eObTs%2BIdtgVanxBUExqGbb5VzrIISGIoUXsmqbgEhJldCQWqRf27SvPAn%2Fo8XmgLhZsUkR4ll37mhk3n94Z4OlzY%2F7NLcYZfm7o1z2zT4vsvUNSXqprBCkmiTFbPX90%2Ffh8GIT2sf%2BzTPdDMf4dVnNg4z%2BE0ixsGeBs9jd5ViSgLHjCb%2FpeaR%2BMD3d4%2FZJg2llyuG2Vwy7QWAs8PNnn1f7vkGSGxAzE6mk%2Bkxkx%2Fp%2F4unffSCR0hAoL1EBCYiPNdWNcwkNQTCR7feWX6g%2B7f%2FA7I8rcw%2FU6UEe0Ndrhc%2FW7mtL9ztmqlSgstSS%2FzTJ28dalpOpkRryrwbhwBACgsLMWPGDOT4ll3qyeqAkJTdCF7P%2FCrUY%2FGkLL1rE%2B2hTbSH8%2B0Lb%2FWEuhzhyaA905blf9Vd%2F895WnZwLHrPevir%2FcvOB1oLYpTtLrm6oYGIMDExAaqtrUVKSgqYGSKCk0WHq5ikkWEWtNL0imv5qUW%2BRclLRjJsrhBAuH1%2FQL8R7HR4xy5nescuP23E6hOA6mLv%2Bsb4uTw6Ogqqq6uDpmkQkcStorX4XRcM1FjZ%2BkvFFjCJKU1WpkNJJUqIMtX1RyLeX3JtQ0JRhmGYZ%2FL27duRnJycuFGISOJ9pqh5lrB6iYgqGOxRrOaa54DcZmKvkJxk8JHC9rKh%2BKVhOsD4%2BDj%2BMwADIf8n5m4xGwAAAABJRU5ErkJggg%3D%3D%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dedit%2C%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dedit%2Dmode%20div%2Evis%2Dbutton%2Evis%2Dedit%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w%2BCiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU%2BMjAxNC0wMi0wNVQxNDoxMjoyNSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDVUMTQ6MTI6MjUrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjY5OTM3ZGZjLTJjNzQtYTU0YS05OTIzLTQyMmZhNDNkMjljNDwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2BY3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2Bc2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDozOWNhNzE5ZC03YzNlLTUyNGEtYmY1NS03NGVmMmM1MzE0YTc8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDVUMTQ6MTI6MjUrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjY5OTM3ZGZjLTJjNzQtYTU0YS05OTIzLTQyMmZhNDNkMjljNDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0wNVQxNDoxMjoyNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjM5Y2E3MTlkLTdjM2UtNTI0YS1iZjU1LTc0ZWYyYzUzMTRhNzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24%2BCiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE%2BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw%2FeHBhY2tldCBlbmQ9InciPz4ykninAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYpSURBVHjafFZtTFvnFX7Oea%2BNudiY2Hwam4CBlgQwXdKREDKUoYg0jbRJ29RJ2VZ1mjRFUxSpA3VTfkzJfkQbS7spU6rtx5Z2UtppScjaHxvLuiatWi2jLEoMIUDCh23g2gbj7%2BtPuPvhOurawPl1dc99n%2Bc55z33fV46ceIEZFkGADAziAgAQERoe%2F9ZK4GPM%2FAcgbsIXAcABCgMvkfAqAa89eDoJyF8LogIqqqChoaGYDAYHr8kItS8uc8iIH6iAa9IkAo5EAQX8pqmgUVBCBggYFgDhv0%2FGAsBgKZpICJkMhnQ4OAgZFkGEYGZUXmp%2B0cS%2BCKBwWA0DVRPOg5Zl2q6zaHyJlnVAMQXVTkwHrUqH0Xsvn%2BtdQAAMQDgpPLS2MViFY8rkGUZzIzaS%2Ft%2FxqCzGggtz9e697zsnKhoLUtim4jOq%2FLE6x7X0nsh16dEZ5a%2FO3a2SCAOHjwInU6Hujd6ThJ4mCDQ%2Bb2G232v7v6vwarPbQn8MGlMr%2BX0kpE3Wr5Zt5hL5HPhqYSdQIfKJ%2ByhxDPKWC6Xg%2Bjt7UXD5b5KBt1kCHS85Ljd8%2FOn3NupfnhFaZj4rWff1B98B1R%2FhnUmKd36bdtCNl4g0en4edNE%2FcXwLq8qMTMIPAQwmo%2FWuHvObA8%2B9c58k%2FdKtD0TyZWXN5YGA7ej7epKxspM%2F%2F7SoNOdWc%2FJyq2wiwhDzPxT8cP0jys3VMM7OmL0%2F77zn4Ydui3b8uiK0jD7RrA77c9Wd57cefPpF%2B2T6bWsFPWkaiPTCWvTsZpHFU%2BXrS%2B8G3AR08F6X%2B1FJvBxQQzHQOWk2SmrW4FPX%2FU2LVwPuDZj%2BfJKl2khPpeyAqA9rzR%2FYqwuiWXX8taN%2FCabGkrVuq9YJlkQQDjOAJ5jAhz9Vt9W4N5%2FrNp8I%2BvtMV%2FaZm4zLnUNNt0urdYnF68HWoJj4Wo1mLGUNRr8LEgDgNqeCh8xQIKOsgC7iAjVe83rT9zQa8uNM28u70kspessu8q8zq%2FV3NcZpVzb9%2B0zmVhOvvvrhaMVzrJg0zeq7xMVCCwdpnWSGBqjUyJwLTFgbvxie3w31uoWR1Y74r60rdxZqrR8q85t2W2MGCp12bm%2FKC3hyaSTiMhxuGrKcahqpbjOaDOoEhOEoFqJQCCJvqA85I6bfTdDjQlf2lbxVNlS6wt19yy7jRHZZlDnrinNj%2F6sHMhnNw2Ogco7O79e5fm%2FxQywRBBCEAuwn4gQ96bkYj4Vyuq9N1Z3Bj4Od5bs0MXt%2FdZZ21ctiqFan174q985P%2BLfp%2BU1g7XDON%2F1ctP458WlVjLyJhOISZE0wM0S1QfuRC3lTjkJAKKEtNC9eIOhSh9xHLZOJRZTFuXDsEoStLkR%2F768ummsaJG9Pb9oe%2B9J%2BxaeSVokiQDSJphAo5uaBuWjiKP4QTqS1cUWU7ayesN66wu22frD1vmVW6GW6T8u9eVjGyZzs%2Bw78Nqu0a2mbvVu1KEJQAgeZRL0liQYyx%2BGOmKeQpu0rMYsAJPNEFGD2dLodLIy6c9Ys7G8yeSUl3tf2%2FX3rcBVJSOv34l3sCBogi7z1LH%2FrBHjl4IJ93%2FncQFAnjeImJD0Z8zuCwu9q3djDXqTlAKID5xv%2B9t2R8n8VcUFBljQ8Gyfe40BYBM4DwDLt8Kue79ZcFkbzfEdbUbv%2BoN4c9KTtsfm1MbYQqqh%2B2zrVZYKs%2F7Ef%2Bbyimt1POYiJhDhPBFBIiIEXhxfs7%2FdfYoIF%2BauBfYTE%2Fpebx%2FV8hqBP2ODvD34yvuh%2FWCAmU75Bx6sIgaI%2Fv5%2B6PV6JLqUsYr7dpDAoehs0h73pHTWrvKgThYbRSt9UmSjef3MpaUvBz4O72UmADgTOPJguGiZor%2B%2FHyUlJWBmJFz%2BD8xTtlUiOpbwpmrmrweeSXrT%2Bg11k4SBN3RGKUcAVCVdFhyP1nreDbY%2F%2FNPyEXUlU%2FPp4XYycGT6V0Ux2WwWdO7cOZSWlkII8diX7SPPNgDaKdbxoNAxwATBAEkEEgSWCEQAqPAMwqvMdCEwMO0tVqZpWsGTT58%2BDaPR%2BPhGIYQAAAgh0P7B3ioW%2FB0iGiCGiwXbCuOHFSJys6AbYFye2T%2BxWhT3WYJEIoH%2FDQBMw3kes8OJPgAAAABJRU5ErkJggg%3D%3D%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dedit%2Dmode%20div%2Evis%2Dbutton%2Evis%2Dedit%2Evis%2Dedit%2Dmode%20%7B%0Abackground%2Dcolor%3A%20%23fcfcfc%3B%0Aborder%3A%201px%20solid%20%23cccccc%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dconnect%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w%2BCiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU%2BMjAxNC0wMi0wNFQxNDozODo1NyswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6Mzg6NTcrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjlmYjUwMDU0LWE3ODEtMWQ0OC05ZTllLTU2ZWQ5YzhlYjdjNjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2BY3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2Bc2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDo3ZWRhMjI0MC0yYTQxLTNlNDQtYWM2My1iNzNiYTE5OWI3Y2E8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6Mzg6NTcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjlmYjUwMDU0LWE3ODEtMWQ0OC05ZTllLTU2ZWQ5YzhlYjdjNjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0wNFQxNDozODo1NyswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjdlZGEyMjQwLTJhNDEtM2U0NC1hYzYzLWI3M2JhMTk5YjdjYTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24%2BCiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE%2BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw%2FeHBhY2tldCBlbmQ9InciPz4ubxs%2BAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAUtSURBVHjajJZ%2FbNT1Gcdfz%2FP53PV6B4W7VltLqdAaplIOiMOoyxxJCSs%2FGv%2FyB4gzJroAosmmDklwkYWR0bQsdmkykoojTpcsWYLxD%2FlRZdMQkTHRtkLZRqG0tIVe7662vTu43n32x%2FVKZ%2Fjh89cn38%2FzvN7P5%2Fl88zwf2blzJz6fDwARQUSm1n8s31CM0%2FVAnbNmsUPuAsDpgEO%2BBg4C7%2F%2Fiyv5hvmMiQiqVQpqamvB6vVNwEeG1JZtCBrYi%2FMrkAwDNgjhwAlbzICBLA0rDb0%2B%2F839C6XQaaWxspLCw8Dp86cbNmqVFJQddE6KzdjZ9D89g%2BB6fSyCOcyn1nxil%2BO9xKg5HqWFSHGXLjrP7W%2FICqVQK2bNnDz6fDxFh65KNvxbHDhF4rJj2bXPo%2BIGfcW5h5xL4f99P%2BFCEMIAob75x9t0dAMlkElNXV4e1lteXbNqiQoMaeOFOjrdU868SD2luYyEP6dUh%2BsYmSHeOU6GO5Z8VLx5%2BNNZxIpPJ5AS2L3upROCoCvz8Lo7vnkf77cAHhpiz%2FzIL9vWz8L8p%2FNvupmM0Q7pjnAoLqz8tDrc8MnQqYVUVhVdF4LEg7b%2BrvDn8wDDlH0WoPpukLJImSBaMwjcJqmwWts2jPZLG%2F8kwYVFeVdXXZcFf4yVDc2cNKfBFmD9X%2B0ncCP58F48eG%2BFeo2CAUkvs4dl0V%2FuJvdXLiiV%2But%2B%2Bn7YLSfxPfMMG54ChzB3WIesVWB2i82bw1AR6fJR7C4VsfYiv6u%2Fk3A9nEgP4zXke8DiYHyAOMK%2BQxPIgnZ9GqSHr1itQJ8DK2fTerDQ%2BS%2FbHRXQJaHSCwNIZ2Xh%2B7%2BS3VAmwNMBA%2FtuPZtErgKquUmdMWIFlRURvdamRNEXGwIWrlP47pTMzLiunxghGMwTLvcTWlHAp77s4QNSrYMQtss6ZMgWqCm5cHoDHO1nbk6K8zEN8%2B3zatv2Hn1b59EqJZdxmYUERg9P9KwpIiAOTdWUWBXuLzB%2FvZG3P1Un4PNp2d1MbmyD45TWCxuCsQm0x56bHGHFYEZwxok7toAA9Sfw3hCcoL%2FNOwi9QO5wmWO1j4JEgZxTkodmcWRGkf3pcX0r8xoAaBixKu4U5%2FxwndM%2B0tpAvS6mP%2BPZK2nb1UBvPEKwKMLDvPj4ESGc55lGy303sdJKQdZB2rkMdctAB%2F4gzN%2B%2FQ2ENNd4LyUi%2FxN%2BbTtquX2thk5nk4wI3gAF%2BOMNcA1nFQDfK%2BBY5GqbkwWabTY5QZhXWlnNx1ntrY1Rz87fuvw29m%2FSn8J%2BPUGAFj5T19baA1IspuBZp7cx1x4SwG1cEf%2BlgRSROs8jGwb%2BHt4QB%2FGSSsAhYano39LWIBxNEIbP14hPDuiyS2VtJuHXQlKKvxM%2FjiXDq%2FD%2FxPlwifGMkJZB2NIoKpr69nxeiZxLHicFSFVWfGqBidIP3LSjrWltD94CyufF%2F4kQgPuVz2Lz93%2BdDRa9eu5QQ8Hg8%2FiXee%2BDy4CKMs7xqn4nwKz9IirhQqmVuB42m8ey%2Bx7LMoD6iAON782eChhqmRuXfvXgKBAKqKqtI0%2F8nNKrQI4BVYXkzHgzPpC88gWuHL%2FcaXrhLoGiN0apSKr0ZZRBZM7q2w5ZnLR1oAnHOMjY0hra2tFBQUYIyZmstvVT1Z6eDlAuEVq7merxmwueNPDXy9PvybjKP5mctHLk4%2FXTKZRJqbm%2FH7%2FVNw1VyEMYbW4FN3WNWnnchKoy5sHeVGBRX6VWi3ymFx7r11Ix8MTX%2Fy5C2RSPC%2FAQB61erowbpqSwAAAABJRU5ErkJggg%3D%3D%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Ddelete%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w%2BCiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU%2BMjAxNC0wMi0wNFQxNDo0MTowNCswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6NDE6MDQrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjc3NDkzYmUxLTEyZGItOTg0NC1iNDYyLTg2NGVmNGIzMzM3MTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2BY3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2Bc2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDowNmE3NWYwMy04MDdhLWUzNGYtYjk1Zi1jZGU2MjM0Mzg4OGY8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6NDE6MDQrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjc3NDkzYmUxLTEyZGItOTg0NC1iNDYyLTg2NGVmNGIzMzM3MTwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0wNFQxNDo0MTowNCswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjA2YTc1ZjAzLTgwN2EtZTM0Zi1iOTVmLWNkZTYyMzQzODg4Zjwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24%2BCiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE%2BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw%2FeHBhY2tldCBlbmQ9InciPz4aYJzYAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYGSURBVHjalJZ7UJTnFcZ%2F73m%2F72PdJY1RbhoQp6lkXRAvmIYxdCUadLVOozPNtGObap1JsKipjiShbdoRbeKEiQHpQK3xj0xa03aamTbaTGyAYV1QGeqFi%2BJyiZFLAlmESBkWRmS3fyzslGkmnZ5%2Fv%2FM873Oe75zzvqqoqAibzQaAiKCUAkApRdHIK%2FNFsx2NR91nOSILADDoJyzNaM4xxbtvPHh0iC%2BJiYkJ1OHDh4mJiUEpFSXPv%2FziPC28TIiXDCOSrAClQDSEpsCwJPIhrEBRQpiSytXlQwDhcBilFPfu3UMVFxdjt9ujFTzfcLBADCoEEAFr1ZbrrNjch2vtEImPBgHob7fTcWE%2BbVXJNJ%2FNiFQlEGLvieXHKmYqGB8fRx05cgSbzYaIsPvywV8pKFaA7fGtLTzz61YWpo%2FxVTHQbufsq5lcez9zWuWhk5mvFwMEg0H0%2BvXrMU2Tn1wp3CtCiQ5DjGd3A%2Fm%2Fv8IDCZP8r4iNmyRrWx%2Fj%2F5qktykZpXKzAjVDVxPzGqemptDr1q1jX3NRnIJarcDKK2hgR2ULXRfncv7UYv7xpovhnhiW5Mz%2BkefeSKO6LJ1A1xzEuk%2FOjm4mRibpuZaMZW3OCtRUND60NmiICCIUShisx7a2sLMiQn4s77uEQgIabnqdfHIlgT1%2FqQeg8vs5dHhdCNB1wYn3RIiC995j26stjAbsNH%2BYiZJCESnS1Y%2FXxIXu8r4YIPv%2FVkVs3CTnTy2ms34xro1%2Bsp9po6sxlTu34ultmsPVvy6is86FCHgO%2BDDs49zpjufBpCG%2BseYOC9OHaTidieicb9ouVAhKtouAseI710ma7pLuqwmgYfHqAFt%2B6WdLoQ%2FLBl11Lm7VudAa8vb72PCin9TlAWIsGGhLACD%2BkSAZnusYBii1XQAPYWDllt6ov2lrBkDBR2%2B6Ofuak2%2F%2F3M%2BG%2FT4wAAPW7fPhKfRTVeqk9qQbFKRmDUTxS3N7QYGYmwzCkqklBGlPDEcTNv%2Bsg9tNCbTXuvBWujE0bHrZj9JE1B%2FwU1Pm5PwJN6YBS9a2kVvQEcWnrh5GTFD3lxkYkqRMgYQlwVldUvDnen73LHTUuqitdKM0eAr9AFQfd1J%2Fyo2aJn%2B2sn4Wdn5qEFODJskgBIjx5T0uCrQA08pnIjS9PERDjPnfOKXAMEBECUoGEIHBj%2B2zkt76UQ6dXheGAev3%2Bcg74Kf6uJPqcicbfuond7cPy4SOiy7%2BtD9nFvZurx00KOk3CNEC%2BmE%2BvjSPBc7IWqgqTaPT60IMcO%2FxsXGa3HfKjRgRdbl7%2FKDg0jtubje6aHj7c7J3dgLQ2zoPwwQ91SooOQdAW1VKVMHty0kA5Bb48BycJn%2FLjWFGbLv4thvvb53kFvjJ%2BXEdWkPfjQVR%2FCcNKYgGMc8JWt5Fa2j%2BMIPPuyI2pa4IoHSkt6vLIuRaQ9q32khzt4GCxtNu6k46GeiIR2lIfDQQsafPzq1LGRGL9Gk9d%2BvrwewvfHPQOoexQVjxdB%2Fauk%2FzmaUMdsfz6bVUtIalT7bxveP1ZHh6GPDPYeSzeD69kcpIfxymFWLNrka%2BljhBTWkWwz2JiJT84YHnz2iPx0P20PkmRF5i6HYiwZFJsn%2FYzdezbzE3cQibY5xV266z6RfXohakb%2BxB9CjanCD9qTbW7Grk4WV38VZm0l6dhQiEw9taHSuDqrS0FIfDwXM3X9mHMsvRAk%2FsauDpQy38P%2BGtzOTGB9mEpkD0C2dS8n8zOjqK9ng8WJZFU%2BJTjasGvaCNXPpvJBPoMlm0OoDNMfWVxONfWNSUPUZ7TUQ56tCZlPwSgMnJSVRpaSmxsbFE1raw82ZxAZZRQUiBYUKGp5UlOX2krBzmoUVjiIKhHge9rfPo%2BWcy3ZeXIYASgL1%2FX5RfMXMvj46OosrLy7HZbGitUUohIuzoem0RofALaOsghgWGjky0MiJTL8b0lOvI8hN1DKXKP0jd3TNTWDgcJhgMoo4ePYrD4Yi%2BKmaeLlprnrtXFo9h%2FAAlG1AqE8yFmBrC%2BjO0bgH9EVpO%2F1F2Dc5g%2F%2FOAsbEx%2Fj0Af%2BUSsQynL1UAAAAASUVORK5CYII%3D%29%3B%0A%7D%0A%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dlabel%2C%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dedit%2Dmode%20div%2Evis%2Dlabel%20%7B%0Amargin%3A%200%200%200%2023px%3B%0Aline%2Dheight%3A%2025px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dseparator%2Dline%20%7B%0Afloat%3Aleft%3B%0Adisplay%3Ainline%2Dblock%3B%0Awidth%3A1px%3B%0Aheight%3A21px%3B%0Abackground%2Dcolor%3A%20%23bdbdbd%3B%0Amargin%3A%200px%207px%200%2015px%3B%20%0A%7D%0A%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%20%7B%0Awidth%3A34px%3B%0Aheight%3A34px%3B%0A%2Dmoz%2Dborder%2Dradius%3A%2017px%3B%0Aborder%2Dradius%3A%2017px%3B%0Aposition%3Aabsolute%3B%0Adisplay%3Ainline%2Dblock%3B%0Abackground%2Dposition%3A%202px%202px%3B%0Abackground%2Drepeat%3Ano%2Drepeat%3B%0Acursor%3A%20pointer%3B%0A%2Dwebkit%2Dtouch%2Dcallout%3A%20none%3B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dkhtml%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%2Dms%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%3Ahover%20%7B%0Abox%2Dshadow%3A%200%200%203px%203px%20rgba%2856%2C%20207%2C%2021%2C%200%2E30%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%3Aactive%20%7B%0Abox%2Dshadow%3A%200%200%201px%203px%20rgba%2856%2C%20207%2C%2021%2C%200%2E95%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2Dup%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABphJREFUeNqcV2twU9cR%2FnbPlVTHxpKRbNnBLyEbPyJisLEcPwgwUMKQtjNJAzNJZkgNNJOmJaZAaDKlxaXDTIBAcJtOOzSYKSkdiimhAdIMjyT4bYgBYxA2BgcUQPLrCiGDR4qt2x%2ByXTASFt1%2F957d7zt3z3d39xDCMQWUfgAz%2FRI%2FT4pSTAJpAGL8rECAXX7QFQGq9wOHOxYO1oCgjAdJj1wtB095Giv9TFuZAIWHAziATMPhTAwiHgUkYPXFJu92lMP%2F2MTpB1AKUCVEgNAcleUo1M%2B2F8TO6crSTncb1QleAOj2OTSX3Ge1p%2BVa42m5JrnzbnsCE8Ov%2BEHgpa0LPLvCJjZ%2FwhuIlN8wAcXG%2Be1LUn9hm238QU84p1Ld83nsXvuO7Lq%2BLzKYGAT6%2Fdn58m%2FHJTYf4O3EShkT8Irpzab1Uz9sGevT5%2BtWn%2Bj6NB4A5hp%2F5NSr43xjfd5rW5tT9e3OAhCBiCua5%2FWsDEls%2FhdvYklZSwDefmrT8eXmtzuDkb5YZ33p9ndylICAVjWxf39xw%2F5g5Luv%2F9H84ZWNcwNEypZT87rXjqyJB85UYDMJYN3U7UdLJ6%2F6JlgqV517teRqf9uTlug8e1zEk27HgD22o98WsTBh8fWxvjm6ApdONbGvse8LM5NUPOm1Cfabuz3nACAgxX0QEFTJAnjNvLJ%2BSepb14KRHnN%2BEv%2B1XJOhZs3Qu1mbG97J2NQgsXroa1dtxrGuf8cHi1mUtPTay0lv1DMJSCRVLtoX%2BFgGgDQNysBAcez89l9nbbsQSji7rlXkEhjPxb%2FQatHOcFu0M9zz419oFSRhj%2F3PuaHiyqasv1Con9NGxHAYUsoCxAqImbYSgCWmFbZQwdsur7N0eC4m6tT6%2FjUZ750Zeb82c%2BOZGLWh%2F2p%2FW%2BKfrmy0hIp%2FaVKpTSIJEqu2QgFx2iE8CwDp0RbH7Ljng%2F4yXr%2BXT3QdyhYsodS0slGr0g2OrEUK7eCrKW82SqzCVz3%2Fyfb6vRwM4xn9rN7JkRkOQRLmfJn2LBPxQjDBqp9lD7XbX7X8pKTP160zR2bdeiX5jYeU%2FnLSTztNkem3XL5eXbltRUkonBxdgZ2IIUmahUxERQSCVT%2BrK5hzQ89xQ6P8VaaK1f5VmRvqQ4G%2Blba%2Bnlnlb5brMhvlk7FBiaPzuwQEmEQhg5BOxMjWTncHc2501cQLkjDTsMCWpyuRQxFP0xXIJfp5FyVW4Zy7KajC06ItbiIGg6ZITBxDxIgbrr1jTSM0fibGIHz8O9sKK0GAibEua9spANh4aY2VmcEg%2BDEkiBgR%2FL2hYFgGtcErkQQAMVJgBxyy9hboZzv32v%2BKpr7qbEECTAIMAoaJa3qPTmNiiAAgJAjk6J5xhu6HDAIgQYGLmI29PocmMcI8MNYvT1ckfzD9H%2Fub5br4e4Me9WfOKqtyX6Ud2cwC449PRamifDm6Auc0rTXokci%2BXo1EAgBckiDuYGLjpTvntcGIA%2BSFcp6uUAaAI879VhWrRteYAqn%2Fedq758brXJ1327QMhgJcZjA3EBjNrgZjOG1PkAjyTGENMjZPq5ECQ0MDE9ERBqFZrk0OJ3i4x%2F7vyIjBxGERt3takgVJEAp9xq3f769WiPDNvSsJdT3HDOEASPelmoBRYT3Kzt5uMtwauJEgSOCpwrk1DIJCoNUMwj9v7MweP9XSQ8%2FhJPp496fZTAICvLqcyv2B7nRbrgCA03JN5h8ub7A8VqpB437xHvsOy3l3cyaB4L2uqxhti1WLMcSgZQCw7%2BbOooO3Pk4JBZIYYXISMV5sKH59UePM10GESRGpIf%2FbE92HU452HywSJIGIllctrhp6YAK5%2BfHds0lLtJFMXNwkV6fFqA29mROefqiMJj1h6um4a5vY%2F92dKGaBxIhU5zJTWW2cJmEgGOmeb3c8FxAfb9mdf2RzyGGv5MvU7QwuEySwKHFp%2Fc%2FM71zA%2F2F7b1RajnYdLAqMukMVu2YcfmDYE2MD7H%2B7%2FXlq6cRIJqm4zXM%2Bqd3TGjVBir43KSLlXjiELe5TsX%2B3%2FyW%2FST45PaAHbKmccWh12AP93JNZywj0kSABIobpiXRHjtZ6faout2tyZMadGLXBCxBcvl6NfaAz%2BtKdFmObpzWl2%2BtIIBACYy0t%2Fyj34M7HvsKUK%2BCGassvicX7alYDwwq%2BvykIEqPVa%2BQ9gdYk5%2BV%2BUE7lj3%2BFGbuBM%2FX5JUT8QwIVSSSZiTgmoFR2MfiqYFFPfjpkyrfWPopwxP47AP1pK1g9%2FdqeAAAAAElFTkSuQmCC%29%3B%0Abottom%3A50px%3B%0Aleft%3A55px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2Ddown%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABpdJREFUeNqcV21QlNcVfp5zX9ikoAvLEsAIIgsoHwpqWAQUNKLNaNv8iZ1JMkNG6%2FQj%2FdDUyCSTtCHpmEkwVk3TToZRMjXj5MOG2KidjIkxQYSAQUAtX6IgIN8su8KCoOzbH4sk4q5g77%2F33uee555z7rnneYmZDB2MKcJKlyYbqOsZVIgGEOgSHQoy4AKbFFjqAo5dWn%2FrNAh9OpO852oeJHYxtrmEu4WALhMbxG2ZE9uFAlImDRLY%2Ft%2Fy0b3Ig%2Bu%2BiWOKsAlgIZSb0OIf15kWtKo1NXh1d5xxiSPEN2wUAHrGOg11jirjWVtJyFnb6YgrzoYwocClu0DI5guPDb43Y2LLp%2FIaqf9JCGSErGvIifxd7aqQn%2FTOJCvFvZ8Hf9haEH%2Bm%2F6sFQgHBv1Sts%2F15WmJLkeyl6FuFwFPzny1%2FZdE7Nfg%2Fxhv1uUmH2w6kggQp%2Byqze7d5JbZ8Im%2BKpucSwI6EN7%2FcYtlxZarBCts3ptfrtq9odjaGKihE%2BsV0vRC3u8RqWmmbij149W%2BWd5p2rnET6bsqsntyb6%2BpO3KqkE8FvLxo74lNUX9s9uTJb8%2F9fG2L81KoogJFYfCm3b9usNq0MXxzw1RsUkDqQICPqf%2Fb%2Fq8sQi3j4WdmtV47OFgNAO6r%2BDEUFAtFAc9YtpXmRP6hxVsI24cvhyoqnFtrK6jM7isgBa3Dl0O94TeGb255MvzXpUIFjVrhxo%2FdzgoARBuwFQJkBK9reCnurxfvXX8CRW3yW1G749vT2Br7ysW0oNX1pKDTPG%2Brm1gHRbibAHLm%2F7522sKnQCZqFgCUaBCqaS%2FbEw9vqtWoQROf3dBBiT6KTACImZ3YueqhDdOWjDbFQ4IzIl4elNUX5begU1HD6lPRmULKeghhDcpqnUmZuD3%2BnkgTH6gZEE9ctlZSoGmG9UIynSCsQVndMyX%2BIZGiBoHMjHh2SreCglClaSBiSEG8cYnD24bv7CWms%2F3FocO3hnw13plTggAFb196NdlPM44tC0zrSg5ItXmyEz070UEKCMRqQgkkBQ9NvL2eSJ%2BrevoJTORSpoT6do4%2F7%2F7UShBFHQexM%2BHdfyUHWO8iN%2FuaRzX3%2FQjUSLlnqM72F4cCRIY5u9Zf%2BY%2BBAv4AvzpkQ7WAIBRujA%2F7Vg6cia9xlId6InafVEAAGnQMUCSkb6zTMPdBy8hU3JjrphIq%2BCrD%2BMvxeyumrr%2B4IH9y7o2GF5eDghuuGx4L2zbWZ9Dc0RoQRbkkFNRdP2%2F0BH7EtLJLKCjr%2Bzqh2l5u8haZ847vTBW24kRFQXKAtcsT5oqz3igQENIoECkjBJUDZSGewBlBj%2FammjLrdX1c%2Ft70ero34gMte9IByLLAjPrUwKweT5jawQshdIuGMiF5XEBU2koivBl9NeEfJeYHwuxtI81zPrn2z6ip60c6DkV1jLTOCTaE2HNjd5Z4s9MwWBOhqEHp%2FI9cWDtUrJNoHm4KO9P7hdnTBoMYXI8Gb6gVCg63FS53jg9O5tA57tSOdHywnCAygrJrfcTgUe5U2cvNHSPtYYoKCWlrTgsIneB2AfFR%2B4F4b6f9ZdTzF6P8Ytud407%2Fdy%2FnL7k9X9i8J9l5y%2BEf6RfbnjPvWa8N5suez%2BKFCgqyPY95Lnd3stv2AcBZ2%2BmFbze%2Blui1xc3dXCUUlPafXNx4%2FaKxcajWWNp%2FMklRw8%2FmPFntbd%2Bh1oLE847KhQQxejVg36QQqD0MPTzHv42Ux%2BuGasJNBnPfwllJd71kkX7RQ3WDNf7dox3BLcNNs6vt34bbbvYHJhlTGp6O%2BJVHb0%2F2HJtX1PH%2BaqECqG%2F5YN1nlXcokGvvO6vCc4x%2BQskotxVHB%2Fqa%2BxbOWuzw8NB3nuo%2BHt0z2hHsuGU3GrWAoZfi3jrxgHpw3BPpobaCH7vbqOw6mHI836vYW3Eqcq9AtioqbJy7ufQ3lhfu8sR%2Bs9%2B3vL8klACsQSu7AnxMY1MxH7YXJp7oPpLulrrj%2B9575Ni2aeVt1teWfEWfHQLCaspseHzOU7VWU%2BaM5G2NoyL4i%2B6j8XWDNQsmGsKu%2Fcv%2BnTtjQb%2Fmm7hfENyvqEAK5v8opjPJaL26KGBpd5TfguuBvuZRgBgY6zO0jlyZXXe9JqR%2B8MK8ntHOMHfHIkhu2b%2F0yIH7%2FoXJ0yFlxYnPUdRbvuILgO7%2By%2B91l6Ka6M%2BcnCf4fMSypXvymHf%2FvzBTD3CuNGUFKT8lmK5Rs5ASqKiBlAGBXFaiSuni0fkp1pJ7Ed4e%2FxsAqLk46EWsG1EAAAAASUVORK5CYII%3D%29%3B%0Abottom%3A10px%3B%0Aleft%3A55px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2Dleft%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABt5JREFUeNqsl2lUlOcVx%2F%2F3Pi9DZRsGBgYiS2RYBQKIjAhEJW4pNrXNMbZpWtTGNkttYmJMG5soSZckRk%2B0p%2BdYPYY0Gk0ihlhRj63GhVUgBhDD5oIOy8AAMwzD4lCYtx%2BGqCQKuNyP7%2FPc%2B3u2%2B7%2F3JUzEZFBYLh62S7yIZDmVBEIBqOwsQ4DNdtBFASq2A4cuZAwVgCCPF5LGHM0Chz%2BE1XamzUyAzCMO7IhMI%2B5MDCK%2BHpCANd%2BU2rYgC%2FY7BoflYgVA2RAOoNYtyjDTe45%2Bhk96e5QywaJR%2BNsAwDhocK61VCjLTYWaclNB0OW%2Ben8mhl22g8C%2Frn7U%2BuGEwdov%2BC0i%2BQ0mIFWzoD7zwVU1czQ%2F6pjIreR3HPX5VL9jalHXiQgmBoH%2BXLHAtH5csDaXtxDLLzIBv5jyfOmG2H9U4S7snbpX43KaPpgBIhDx1rPzOlbfPC5GQT%2Fnd1mS1zABa6PfPf5y5F%2FrcJeWpp7fPkly6f7KXBRCoOSATFfXll19x74HDsvFCghsJAG8HrvlvytCXm7EPVqc5wyzp5NX15muE1omKXXyMnd9yy5r5Q3wPghvJzrLAlimXV38%2B7D1DbhPFq1M6O4b6rPVWKsCBfHi5EWWv9TkQBYAEPpLvERMC9N8FtRvjt9dPl6wwo5jPvuas7WV5jNqEjz8wA%2BCBsaan%2Bw9x1hrrXJtuaZX97ooLfqPLCUEGRR%2BiOwAsF2X98Uc30W3fb02u41frVqeVmo6FUkkwCAwCWxJ2Ls%2F0TPFNBb8TNdp9WvnVz4OAKdmX2QOzcMsAAjziDGMBd3asCF6SXHyknJTfqQTK%2BzpvhnVKT5zawCgzFTgN94pJXvP7gxxjTAIkpB%2BMnSWRMQZYEDnPVt%2FK4ejbZ%2F77726Lb6h95tAAiPELaJ1bcTbRfGeM8xv1azWSeyEa0P9igk%2BNr1%2BoNFfkpwzJCJKIQA679ntN08yDXYo3qh%2BLuUrc0E4EcNL4dP7VNDzpU8FP3vpekoQQ5CEw4bPdEfa9%2BsAgEZUmkmAAAS5hLQ9p11XGO%2BpM8V5JLUfMeQARDMlEMKIGFOVCZYb0C7Fz0oeXmIZ6nZzYoV9od%2FjVS%2BGbahUOnn9b7T6sEOviUGyA8bMDlUa0W79wBW%2FbZf%2BlrY98cDBUI8YCxGDgHCJiVVEDN8R7QWAE8Z%2F%2B1mGut2i3eP1r0S%2BXRztkdBzq6NbF7WpbF3UprKxjvfHxbrfttla%2FQBArVDbJJIAQCURMRg8ugrKIAKBSNxzHtN3VdmxY0iQYSZmTeegwTlgknYAAB7RZBh2Nm7urbeeC1r19ROT52kWn3shfH2Fu1AO3RxjY%2F0fdac7%2FhPPJMDE11GC%2BHpBJmIEuAS3Oa6w01lybMbMgvgCE6O255zy24DeCr%2FBvckn9%2Bu8ZjXYIYvjxoMJy8oeXZrT9GHIqMWTwA2oI6cFMeDIcAiSEOyibXsmZG0hAFzuq1OyY6xBAnMJgdPOmks08zU%2FbbsB9x18P37PqS%2Fb8%2Bo%2Fa96ZcLm3PmBH46Z5x40HW1eFvl4Uq0w0MwiCBOb7%2FqTsd6GvVY537DXWas1Iw1AiNJnOgwJi%2BbXhAbE08OnvaXSIW0TvYw88eaF%2FuM%2FWNdju3m5r9TlhPBzVNNDoPGC%2F5tRma%2FGJ80xqjPPUjVuvP2narrMOWd1Jlv%2FE1fN782UiNPZf9C%2FqOKa%2BndOz2j%2Bcz046sn%2B6KrVOsODirpOxld0lUxmEBK%2FktvGgFd2l6taBZn9BAtEz5xYIvAn4%2F8rFKkgstAyZ6Yf%2BS67ezlkiSU73XXRV6xqh93TyssR4JF75efBvymLdE03jgT%2FWb5tutLWpGbTm7wHZxQQAT%2ByDuKLyHRIk4cnAZ4pfCF9%2FHvfR9uh3xBxtz00BANsVDylnac6wAICaHMiBmW5NRLy4trcq0MtZ3RnpHme5H9AvjYeCc1t3pzMJgOSVnyw4eHZUB9Kyu68iMFPpysSppab8UJVC3Rnp%2FpDlXqF7mnYsdKQbv7cr6fDGW%2FZczbt6jgUtV6kIlFxuyg%2FtH%2B6zJXmlGe8G%2BmlzdsyB1j3pTAwZ9q3%2FSspbc9tmDwD0H3UffXCFlyuTlFpnPRdYb612c5c8%2BidPCu6fCLDKUubzsf6fSaWm0wmO9hbvZU8fDR2zoZ97OuppAu0UJEDEmOISZohT6q7Gek5rD3GN6FEp1DaAYB7sdNYPXPao7anS1Fmrg402g7%2BjYhGIaOXOaQc%2BuONfmCwZXJIf8xKx2KRgxYgOS%2BCROuyoyQKCxIhkOr4T6JWgxGnvZ1HWnf%2FCfHcBXxcnpRHxYwRKkUjSErFKkAQiNjP4kmBRTHbKm5KkKxwL%2BK39fwDX1XGF8ct%2B%2BQAAAABJRU5ErkJggg%3D%3D%29%3B%0Abottom%3A10px%3B%0Aleft%3A15px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2Dright%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABs1JREFUeNqsl3tQlOcVxp9z3m%2BXygK7C4sLxkW5o4CAkYssFSkRjabjJEOSJm1IbZx2krapiZdeprW0NVVJ0pqMM0kYJQlqkoZImGioE1ItiCAgIsFwE4Es99vCslwChf36xy5EW1A0Pn9%2B73fO772e93kJC5EMCszFd20SbyFZNpJAAACtjWUI8KAN1CRAJTbg9LXNU%2BdBkG%2BXkm7Zmg4OWoUdNqZXmQCZHQFsz0yOcCYGEc8mJGDnl2UTh5AO2x2DA3OxDaAsCDvQ32VF11qP9aZYz6SeFeooi17pPQEAvZNdTnWWKnWFuVhfYT7v0zza4M3EsMk2EPgnNZusby8Y7P8x%2F5lI%2FgMTYNSnNKQt%2F0Xtev1DfQtZlaK%2BM54fmDJXXhg4G8zEINBfqlLMe28L9s%2FlQ8Tyr5iAJ32fK%2Ftj%2BOFq3IUO1O%2BJyGk7GgsiEPFrlQ%2F07bixXdwEPckHWZJ3MgG7Qw9%2B%2FmLIS%2FW4SyXoNvQskpyHLg1e8CNQ3NI0laoje7Tg%2F8CBudgGgQwSwO%2FDD322ze%2FFFnxLRWhiBzUK94GLA2f9mSTjfU%2B7mjqyrVe%2BAX8I4aGgShbA0%2F47Sn4ZuLcR90ih6qih0anRiVprtUEQb43bYtlXmwNZAEDAj%2FACMW1M8ExpeDXyWMVCEl4yF7vntR%2FzLeov8JJlWfZR%2BY3N92%2Bcx%2FreOmu1quNrk27EWW0xvWspJcigoNNkA4C3Yk59vH7xltvu3ktDxe7PX34ilQCQfeci1j2xfn94ZrGCneY8uxcHCnW%2Fvbr9EQD4d2ITc8AprAOAQLewroVAAaB8oMiLiRHvmVy7znNTjWCFrXKoJOSHFQ%2BkvnF9f%2Bjco07s91MFdwmSkHQuYB0T8WYwIcYj0bTQdRufGlFKJMFVaCb%2FGvZW6aGI4yeXOwd2mr%2Fu05zsyDY%2BW5X64Nm%2BfO85NpuJiCFJTpslIoonADEeiT2zIzIXuh%2Bo25PQNtbsNVMOBUn2g08MiSTHN3uZjNTEDr4dnX%2F6H%2B1H%2FXPasmKvW%2BsMGfW%2FMXzende4K3h%2FibvSYxIAItyie%2FK7cgCitQxCIBFjpTrKMgM%2BWPfrhLbxFi9iMQtlYjAJSCSBSYBAIPBNI3p86TPXj8bk56R4PVylFE626uFLQc9efiTVPDmgBIAAtzALEYNBQRITa4kYix21FwBax655CVagPLk7806Pj1qo%2F7MraF%2FFQ14%2FaMhszYhvGqn3KTef89rklWrSKXUTkn3mtJK9Bzf3XJA0e%2FPcrdgxIwSCDPmbZMQgABJkDBKzvn%2Byy2npIv9xAPB1Ceo2jTZ7Gc8afipIgEhAkACDwcSQQZBIIGnx5it7gg%2BU3wgcnbZKR1r%2BFnW%2Bv2DVtDwtXCXNSKz797oAwDzZ7ySRAIBBFsTXmBh1w1%2BoZ4J3h%2Bwv9lUFdbMDOrO%2B5IAqWIGZthuV13nC77nKRx8r7PssyibLIkoT1%2Fh65HsfzWyu5tF6NYNB4EYJzKUETqgcLNVv0D%2FcDQBrNAnm9%2BLOfTLfNB5u2hf5z%2B6TMexYji%2BtVdrM5leMbWOtSwQx%2FF1C2rcuebIqwSO568a4WmuN3mEYSiUi%2BpRl2l1pLvYBsKArUKVwnZRYgdHpMWVG4%2B%2FWXhwoDBXE7OmkHzJ6JNemLfv51bniGqzVPoIkyLbpfK7ZMFIkE6FlrMn7Ql%2BBbiHg%2BzXGbgLjylDpyosD58KZmKM0cfWHI9%2F%2FaD5o1VCZrnO83VuQQOja5PMCfwK8n3K2ChIbLVOD9KB36le3A%2Bu%2Fs2Q81C2yRavQmQNdVnamLnmq4nHD9jpB0rwm77jpjTW9E906Bu18fWlWCQHAox9CtGoXTwmS8IThZyXPB%2B29inuoE6bMsDM9ufEAMNHqJuU8ljMtAKA2B7IhzaWNiLfWjVQb3J10%2FSGuEZZ7Af1X7%2BlluZ3HkpgEQPL291M%2BqbzJgXQcG60ypKlVTGwsMxcFaJW6%2FhDXVZZvCz3RlrmRiQHwy9nRn2bM6bnas4cLfH6s1RIorsJcFDA2PToR7Z7QezfQD9qzwvI6TyTZC47ttXeiT%2B2c1%2BwBgOndoTPLt7mrmCRjvfULQ4O1xsVVchu7b9GysYUAqy3lnsdNb0aXmQuj7PYWL2etuRl6S0OfXLjiGQIdEY6K5esc2BWhjvkqXLO6x08VPKxV6iYAwuBkv5NpvNmtbrhaX2%2BtWdY70eVNINhtLW0%2Fsjrv6B0%2FYdJlcGlR2AvE4hUlKwHQ7BU5cz8LRx0HaPY7gXb53L%2F67%2BmUfudPmP%2FtwOWS6AQi%2Fj6B4iWS%2FIlYK%2ByGYJDB1wWLErLRKd%2FomOJbAWf03wEAyO9m%2B%2FTtS3AAAAAASUVORK5CYII%3D%29%3B%0Abottom%3A10px%3B%0Aleft%3A95px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2DzoomIn%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABiBJREFUeNqkV2tQlOcVfp7zvgvDRe66y8htXUBR1GoFI%2BBtFJvRtjPJBGeaH2a8DGmbttgSTWbSJEw6TWOsrbbpTIeJZGqaTipTa6LJZDTVUTYQdNAohoso6qLucnERN0Axcb%2F8%2BHaJUHDX9Pz6vnnPe57vXJ5zzkeEIwaYcwBL%2FVrW0TCKqZANINEvBhSk3w9eUmC9HzjcsfarOhBGKJN84GkVJHcetvqFu4SAIYELYlpm4LpQQMqoQQKVnzeO7EYV%2FA8NnHMAGwHWQJmAjtg895LkFa7FU1d258UvGLBGpI4AQM9dd2TrwNn4016n9bS3LqNzsD1VKPAbfhCyqflR31thAzv%2BLa%2BQxotCoNi6pn1D1s9aVli%2F3xtOVk72fjT1XVf17E9uHZspFBD8zdk13pdCAjsOyG6KUSEEnrT%2FtPHluW%2Bcw7eQ19q2z6%2Ft2rsYJEjZ07S6d%2BukwI5%2FyQ7RxnYC2DZnx8dbHNs6xxs85T2R9GprZcmVwYs2BYWsmBzP83m7nIVJS73jdfdd%2B7PjjUu%2FXWUCGTtPre7ZHjxTY3Kq8DoV8Ou5u49snPGrKxN58syZ9aVXBztsigoUBd%2BXt2NbfZ8llaVvah%2BvOz9hcX%2BCJenWp7eOOYS6ePpTU1w39vk%2BAwCzFPdDQbFGFPCUY2v9hqxfXJ0shNeHLtsUFc6UequbVvdVkwLX0GXbZPpl6Zuu%2Fij9x%2FVCBU1dU7bfdFYAIDsSFRCgeOqa9hfy%2FnDhwfwTKOrRd0U95n0iqch9%2BcKS5JVtpMCdkllhAhugCHcRwAb7z1tCEp8CCXAWAJRoCFXIYnti%2BsYWTQ0tll0wQMk%2BhGUAkBOX714xbV1IyuhxHhIMC%2FiR5OV9M2JmuhU1Vh7PXiakrIUQhcnLXeHQxPT4GyAtFqgwgAPF5iIFWkeu1SSLCKAweXn3%2FZR5rXV7SddQpy3YDoNems9qTI5hGCitm1MOAAx0aaFCerTd84zjBed3Egq9ADA%2FrqD7Q3ctQC4REDmkYHb8goGgsR2tz5V0DV%2BxUdQoqAQ81RybU4IgFWgACgpaLLCIBUo0bv63y%2FaXy6%2BWBHWz4%2FIHSIGAuVooiaRgWqD3AsDVoQ6bEgtOrfJUhwrf0WUtk%2Br8sL6wvHvk5ijVUiJSRrQZuURtfoGMuaCoRyfP%2FyMy0XykgAA0DPRTxNp31x2ZFuUYBgB7bK7HNdhpKz6WXq6oQCooKghMKhkgji77vBoA1jkXlAvVfRQjFMUcmxSkRWd6gpjeu32R2kxTvyhKh1DQeud8fFBh26zfOe0xuR4JgAbzywCoRSzfeDUKatJKUQK%2BCjKiHZ6nZ2xzBnU7B9vixTy7qCHSQEhJU3%2BDtdT6mAcAFiWUeP%2FxyPH3Jwrfo3XzysemRcEA8F5RY8h6aPE1WwMLQ4OQ%2FEBANHmdGWHlzZyxk3ayB0m771yGooYy%2BKE0l35x0iBxZehS6ie9R1PCMaDvCzWDXA4hZ283ptwcvp6qqDBnyao6AWEQrBQQ%2F7y%2Bd3YoA%2BNBTAaElo973p8tVFCQyipW%2Bc3pdNu7BwBOe%2Btm%2FeniK%2FkPFWowpMfvuKrzzw80zSKIkWsJe0bHYu163BNwMwDsv7G36ODNtzMnM5IWZfeQgscbisvLPl1aDhLTo7I8k%2Bn%2Fp%2Bdw5pGeg0WKGiS31K6vvTdmA7nx9uDZ9A3xMUIpbvSezE6MSOmbNWXewHhD6dH23o7BlqQvvrwTK6KQFpXl2WyvcE6LTB2eCPSdrurvmcUnO%2FcVfPD6pMteyfGs3QKpUFQoS9tU%2FxPH8xe%2BTdd693pN%2FpHug0Xmqntvz1uLDo9Z9v5nnrn%2BdvujrI1JMUJd3OY7n97ua46douOGpkdlDoUDeG7g1NS%2Fu%2F5a0Og9scCsB%2BysWXSoMuyFftWJvM0E31SBjmWPznHPjy%2B8NjdhYfeMmJl3EiNSRgCi%2F25fpGu4M671zjlrm685s2fEnUoQ5lrLLW8uPLj3oX9hqgxIw8n8X1LU7yMkItCHzREZrGQV6ONmy5TggHk247sL%2F1jFqof%2FhRn%2FAWfqC0pI%2BQHBIk3tICXRrFTpF8hlJaqefh6yFxQ6HwQYlK8HAKyt3WsWxl7fAAAAAElFTkSuQmCC%29%3B%0Abottom%3A10px%3B%0Aright%3A15px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2DzoomOut%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABV5JREFUeNq0l2tQVVUYht%2F3W%2FvACMr16IFRQDiAgChpgiikMqY1WjnN9KsfGOXYTOVgkvbDUsZuXrK0qZmGUSvNspjI8TZOmo6AGBoZYly8YB6Qw80DBwQ6jJ3dj30OZZmiwvtv77XW96y91l7v9y1iMNLBuCI84tZkIXU9gwqxAILdokNBOtzgJQWWuYEDFxfcLAGh3y0k79iaD4mfjOVu4WYhoItngBiR6RkuFJAyEJBA3m%2Flri3Ih%2FuewXFFyAG4A8oAWkcm2meEzrFNH53Vkhg4xWnxCXcBQGu%2F3bfGeTbwjKPUcsZRElnfUxcuFLh1Nwh5vurx7s8GDbZ%2BL%2BtI%2FU0hkGGZX5c9%2FpXqOZYn2gazK8Vth0fvsRUknbx%2BbIJQQPCts%2FMda%2B4KthbJFoqeKwSejX6pfO2kjytxH1pfuyqlsGH7dJAgZWvFo23L%2F9muboF%2BJxtE0%2FOEwMqJG46uSHinFvepTPO8lhGaX%2BfPHSdjCKaPy%2Fb3v7az58h%2FwHFFyIHCRirgjUlbfsiJWXEFD6iUoOkdQaaQ6z9dP2YVahljF4%2ByXdvZ%2Fevf4G%2BhQk2sEAUsti4vWxa35gKGSBMDp3T23OxxVXdXRijKovSFzrerC6ELAMT6IhcCZIyeX7c68YPzGGLlxq89PyM0q5YU2M1RuQAg0EERbiaA7Ohl1RgmPTM2p1qjBk1Mm6GDErsfswAgLiDZPmfMwrbhAqeHzm6P8Z9gV9SQdTx2lpCyAEKkhc62YZiVEjTdRgo0zXeBRnImAaSFzm7xdjjtOBGyvmZVZkNvfZjXDhU14%2BBToFEDKRAQpAJ0HRTjP6XHpYUKEX7RzS9bV5c%2BFJTmAICUgNSWQ%2FZCgJwhIOJIQVLgFKcXvKHm9cyGvithFDUAFQqECho1CBUIggYapAJ1QEFBExNMYoISDU1%2FNIR9cvndTG%2Fc2IBkp2fC8ZpQgknBGI%2F3AsDvvRfDlJhwem5zwYMs7VNlaUtbXE1h3mezj9mlGSsXrBkzkFsGKGoDmedBJLfLjxQQgAYdHRSxtPfbfceNsPYBQPTI%2BGZbT31YxrGIpYoKpIKigkAgFOggNBrbQBBCBaEM2L%2BiGGmTgnF%2BUc1epqO%2F3VejAoAOUZSLQkFN17lAb4eVCe%2BVRvvHN4sH6t1feqAmMUGoPHvvhdLzTjzfKoj0sza%2FGLOy1Bu3vqc20Pgl5YIGkVOEZFZ0nLLMszzdDADTgjIdX6Uf3zfUx6m6u8riKRhOCcmDAqLCURo53Oe4rrsyUlGD0nlIqubdKNZJXOm9FH6y7Yh5uKBnO8vNTX2N4YoKE2fMLREQOsE8AfFN4%2Fak4QIfbd2XJFRQkLx85ruN7NTp2AoAZxwlCR9dWJc81NDdtoLkc86KBIJwXQ3aOpCPqwuhR2SPbCBlUc2NyogQX3N7wqgU51BAf2w9EFXUtCtLqADqS76ev6%2Filgrk2q6esxHZgf5CySh3FMcG%2B5jbE0ZNdj4odHdDwWPGcZNNO1MPbrxtzdW4s%2BtI5HPBwQTTzziKY3v%2F7HGlhmS23g90T%2BOO5L1Nu7MMw3Fv%2FTx1f97%2FFnsAYPui8%2FD4nBB%2FoZZR230uoq67auQoLaB37Iio3sEAK52nR39p%2BzS13HFiilHeYtOOabdC71jQzz2R%2BALBbcrjWNF%2BcfaUwLSrk4KmtsT4T%2BgK9jG7AKKjv93X1lcfUNNVaantropqddnDCcIoa7lk29S92%2B%2F5CpOvQ04VJ79KUe%2F7iI%2FHh40U6c3PyuPjhmWKN8G8Fvnw1A%2FzmX%2FvV5h%2FT%2BCXstRMUp4kOFOjZiUlWBkFQYdALitRZXRzf3RqWumdgF79NQDBOa2V%2FiYSHAAAAABJRU5ErkJggg%3D%3D%29%3B%0Abottom%3A10px%3B%0Aright%3A55px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2DzoomExtends%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABptJREFUeNqsl21QlNcVx%2F%2F%2Fcx9hIipuAJHasgHlRdw0xay7yK7smg6sb2DSdtqZduLUNENmOk1tQuM4U7UzTvshSRlFZzoNCWSSSTJp%2B6VNkLCAeQHBoCCgqNBE0wUqL%2BKuwIiiZZ9%2BeHa3aAS3Sf8zO8%2FL3nt%2B95x7z7n3YWlpKUQEJAEgch9%2BJola9xEC2ADBVgAOKqwCYAqKDgUJBIHPBWwFWQNdbyZFBwAC0GGIAHQSj3%2F8HHRdhzYbdDfwg4IjAsGvICgXAroYBiCEDkBBACBZoyST4gDwQqh7mQ4cEkhQD0EBIIggRMQAh2EiEvEYAGrdR3YSqIYCIEDaotVDeYnu%2FryEjSOr43PHl8WmTBPA6PRQ7IWJrvhT%2FubkU%2F7m1EvX%2B1KEUh7Ug%2BWkPEXgdUSkR%2Bxrd0NJ4qjr8AEI9pGAI7mo78mHfnF%2BY%2FK2K7iHUheuvJG6cOUNz%2FLvDwPobrpSl%2FRuf2VOy9UPs4RSTSANwH4Y449EVdnt9ojHIeghCHYLgR%2Bn%2F7zt4Np32tIWZU4hSpnjVk1t%2FcaPfOO3%2Ff%2B%2BMNH5TVJcisoEoo4ksgbsXwYfdR1%2BkQplQuCFNS82Pp%2F9%2B158RTkTC0ce0OKutQeOp5PME0qcUBqyBmwGOC8vz4AWVOyE4CUqYO%2FDh%2Bp3pj%2F%2FBb6mHllqCyxd8ODVT69%2BuFKoOYTSnzFg7SJpzHFNQYWiQrUIsCN9V%2BuOh375zz179pSGI1FSUuK12%2B2%2BaGDt7e3muro6T%2Fh57969lZdvDrT%2BZbA6n0B1nfPVN7e0PjMjIgIIdkEAR1JR329yDvaE0%2Bl%2FhQKA1Wr1bd682SsikUW7K%2BO3PesTNvaSAiXaLhGBvO86RFEoJ4Adac%2BeDxsgiZKSEm9NTY3n5MmT5mjBHR0d5vr6es%2BmTZu8SqnI%2Bx%2Bs%2BOl5jRo0auX1jtepQaEAADKWWIbcy7ZGUmb79u1eu93uI%2Bmtra31HLj5TGDs9rBJICCNn1GRCKGCUJAUuzzw6CfbTB6Px7t27VofAG%2FYXl6Ceyw9LmvIN3UxZUafKRACWyCELcHVP3vk4fDabDZf%2B2N%2FD9g%2BfsLEEFSooFGDogZNFkBRgSCsTcWm066jgRAU4et%2FF5u9nxRosmCLRmE%2BQdgSXCNzhW%2Fs9rDJ63wVJx77V%2BV8YS6UNaW8BdOcqzx%2B3Ujt0F8Bcr1GMIMU5CzJHZ%2Brg6IGCYV2PimoyIK6lzIWrxkPTVGmRoqJFCyLTZmeq4MB5f3BVADnbpcQkzStUQMAk0YKBPfzxlhA95NQQe43QBotBECAFFyZHo6dz6CKCizAPFPivzUWqxm2AqIgnwkFvZNn4uczGK3Hah7wpet98UZ85R8aKScIcXYEWpMLkx8fvleHpNjlAWtTsakQa0pVKGcJQqMGUqCHBvfdjp%2FgTP6xwFzg85PdyaH2J4SUowKiw3889e4KBACnT582W5uKTV2uusAdUFlgzBcFQoFGDT35HwW%2B82mhqaenxwwA4WtYfRNnUkMZUqsJpEkn8cXU5yktYw2JjsTCMQDwer0ekt6GhgZPUVGRd3fu7qjqdU9Mj7mlpcVD0tvS0uKxWCyVANB5rS3x8s3BFEUFgTTLtuZndQHLBMSfB6pyZtfqMDQ3NzfqTcJisficTqc3BI%2B8bxh9L8corarM3fnDoIT%2BrACAU%2F7m7MOfHbCEwQDQ2Njo6erqinqTOHfuXNjjiI23%2BystZ8c7smmkWgVJcN%2B%2BfRARfLDhlacEUqVEQ1nm77xPrHjSh%2F%2BDjo3WmN%2Fs%2F6OHEOgIPr2h63tVuq5Dud1ukETWoK3zorkzTiiONn%2FTKlNM4lj24m%2BPf13o2wOVHqGA5MsAXjKPrDaqnMvlQnjTzhy0Nlw0d5oI5p3yN62amrk%2Bve5B5%2BhXgb47WGX52%2BV3NgoFOvQKAGUkkTqcbZy5XC7XHYf4zEFr3aXU7jih5uidPPOtvsmzixZr8VMrHjBHddLsHj%2BZ9Fb%2Fn9a1%2BT%2FJDaXey0IpEzEKkHnU8Jj79%2B%2BPeEwSSimQRGP%2BGz8j5DVFBVKQtjBj6JGlNt%2FD8Y%2BOpMdlTphiEqcB4tqtsVjfjUtLLkx0J%2FdOnjWPTg%2BlEARIEHwaQJVQIYggACC%2Fqxi6rn8ZHL4XETSsf0MU1HOk%2FCFGYgAwskUqY5eBitRxzn7%2Fa0V1EEBwdqkN6jPI7y4xPmHmC5unbWdQRMqP2d86qANOksU6gvmArNQRNClqABnQgYuK0krI%2BwCOAyH3DK%2FvqOXhaf3PAO7mIRjDNV25AAAAAElFTkSuQmCC%29%3B%0Abottom%3A50px%3B%0Aright%3A15px%3B%0A%7D%0A%2Evis%2Dtimeline%20%7B%0A%0A%7D%0A%2Evis%2Dpanel%20%7B%0A%0A%7D%0A%2Evis%2Daxis%20%7B%0A%0A%7D%0A%0A%2Evis%2Dcurrent%2Dtime%20%7B%0Abackground%2Dcolor%3A%20%23FF7F6E%3B%0Awidth%3A%202px%3B%0Az%2Dindex%3A%201%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Evis%2Drolling%2Dmode%2Dbtn%20%7B%0Aheight%3A%2040px%3B%0Awidth%3A%2040px%3B%0Aposition%3A%20absolute%3B%0Atop%3A%207px%3B%0Aright%3A%2020px%3B%0Aborder%2Dradius%3A%2050%25%3B%0Afont%2Dsize%3A%2028px%3B%0Acursor%3A%20pointer%3B%0Aopacity%3A%200%2E8%3B%0Acolor%3A%20white%3B%0Afont%2Dweight%3A%20bold%3B%0Atext%2Dalign%3A%20center%3B%0Abackground%3A%20%233876c2%3B%0A%7D%0A%2Evis%2Drolling%2Dmode%2Dbtn%3Abefore%20%7B%0Acontent%3A%20%22%5C26F6%22%3B%0A%7D%0A%2Evis%2Drolling%2Dmode%2Dbtn%3Ahover%20%7B%0Aopacity%3A%201%3B%0A%7D%0A%2Evis%2Dcustom%2Dtime%20%7B%0Abackground%2Dcolor%3A%20%236E94FF%3B%0Awidth%3A%202px%3B%0Acursor%3A%20move%3B%0Az%2Dindex%3A%201%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dbackground%2Evis%2Dhorizontal%20%2Evis%2Dgrid%2Evis%2Dhorizontal%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%200%3B%0Aborder%2Dbottom%3A%201px%20solid%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dbackground%2Evis%2Dhorizontal%20%2Evis%2Dgrid%2Evis%2Dminor%20%7B%0Aborder%2Dcolor%3A%20%23e5e5e5%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dbackground%2Evis%2Dhorizontal%20%2Evis%2Dgrid%2Evis%2Dmajor%20%7B%0Aborder%2Dcolor%3A%20%23bfbfbf%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dmajor%20%7B%0Awidth%3A%20100%25%3B%0Aposition%3A%20absolute%3B%0Acolor%3A%20%234d4d4d%3B%0Awhite%2Dspace%3A%20nowrap%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dmajor%2Evis%2Dmeasure%20%7B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Aborder%3A%200%3B%0Avisibility%3A%20hidden%3B%0Awidth%3A%20auto%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dminor%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Acolor%3A%20%23bebebe%3B%0Awhite%2Dspace%3A%20nowrap%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dminor%2Evis%2Dmeasure%20%7B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Aborder%3A%200%3B%0Avisibility%3A%20hidden%3B%0Awidth%3A%20auto%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dtitle%20%7B%0Aposition%3A%20absolute%3B%0Acolor%3A%20%234d4d4d%3B%0Awhite%2Dspace%3A%20nowrap%3B%0Abottom%3A%2020px%3B%0Atext%2Dalign%3A%20center%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dtitle%2Evis%2Dmeasure%20%7B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Avisibility%3A%20hidden%3B%0Awidth%3A%20auto%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dtitle%2Evis%2Dleft%20%7B%0Abottom%3A%200%3B%0A%2Dwebkit%2Dtransform%2Dorigin%3A%20left%20top%3B%0A%2Dmoz%2Dtransform%2Dorigin%3A%20left%20top%3B%0A%2Dms%2Dtransform%2Dorigin%3A%20left%20top%3B%0A%2Do%2Dtransform%2Dorigin%3A%20left%20top%3B%0Atransform%2Dorigin%3A%20left%20bottom%3B%0A%2Dwebkit%2Dtransform%3A%20rotate%28%2D90deg%29%3B%0A%2Dmoz%2Dtransform%3A%20rotate%28%2D90deg%29%3B%0A%2Dms%2Dtransform%3A%20rotate%28%2D90deg%29%3B%0A%2Do%2Dtransform%3A%20rotate%28%2D90deg%29%3B%0Atransform%3A%20rotate%28%2D90deg%29%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dtitle%2Evis%2Dright%20%7B%0Abottom%3A%200%3B%0A%2Dwebkit%2Dtransform%2Dorigin%3A%20right%20bottom%3B%0A%2Dmoz%2Dtransform%2Dorigin%3A%20right%20bottom%3B%0A%2Dms%2Dtransform%2Dorigin%3A%20right%20bottom%3B%0A%2Do%2Dtransform%2Dorigin%3A%20right%20bottom%3B%0Atransform%2Dorigin%3A%20right%20bottom%3B%0A%2Dwebkit%2Dtransform%3A%20rotate%2890deg%29%3B%0A%2Dmoz%2Dtransform%3A%20rotate%2890deg%29%3B%0A%2Dms%2Dtransform%3A%20rotate%2890deg%29%3B%0A%2Do%2Dtransform%3A%20rotate%2890deg%29%3B%0Atransform%3A%20rotate%2890deg%29%3B%0A%7D%0A%2Evis%2Dlegend%20%7B%0Abackground%2Dcolor%3A%20rgba%28247%2C%20252%2C%20255%2C%200%2E65%29%3B%0Apadding%3A%205px%3B%0Aborder%3A%201px%20solid%20%23b3b3b3%3B%0Abox%2Dshadow%3A%202px%202px%2010px%20rgba%28154%2C%20154%2C%20154%2C%200%2E55%29%3B%0A%7D%0A%2Evis%2Dlegend%2Dtext%20%7B%0A%0Awhite%2Dspace%3A%20nowrap%3B%0Adisplay%3A%20inline%2Dblock%0A%7D%0A%2Evis%2Ditem%20%7B%0Aposition%3A%20absolute%3B%0Acolor%3A%20%231A1A1A%3B%0Aborder%2Dcolor%3A%20%2397B0F8%3B%0Aborder%2Dwidth%3A%201px%3B%0Abackground%2Dcolor%3A%20%23D5DDF6%3B%0Adisplay%3A%20inline%2Dblock%3B%0Az%2Dindex%3A%201%3B%0A%0A%7D%0A%2Evis%2Ditem%2Evis%2Dselected%20%7B%0Aborder%2Dcolor%3A%20%23FFC200%3B%0Abackground%2Dcolor%3A%20%23FFF785%3B%0A%0Az%2Dindex%3A%202%3B%0A%7D%0A%2Evis%2Deditable%2Evis%2Dselected%20%7B%0Acursor%3A%20move%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dpoint%2Evis%2Dselected%20%7B%0Abackground%2Dcolor%3A%20%23FFF785%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dbox%20%7B%0Atext%2Dalign%3A%20center%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dradius%3A%202px%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dpoint%20%7B%0Abackground%3A%20none%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Ddot%20%7B%0Aposition%3A%20absolute%3B%0Apadding%3A%200%3B%0Aborder%2Dwidth%3A%204px%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dradius%3A%204px%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Drange%20%7B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dradius%3A%202px%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dbackground%20%7B%0Aborder%3A%20none%3B%0Abackground%2Dcolor%3A%20rgba%28213%2C%20221%2C%20246%2C%200%2E4%29%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ditem%2Doverflow%20%7B%0Aposition%3A%20relative%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2Evis%2Ditem%2Dvisible%2Dframe%20%7B%0Awhite%2Dspace%3A%20nowrap%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Drange%20%2Evis%2Ditem%2Dcontent%20%7B%0Aposition%3A%20relative%3B%0Adisplay%3A%20inline%2Dblock%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dbackground%20%2Evis%2Ditem%2Dcontent%20%7B%0Aposition%3A%20absolute%3B%0Adisplay%3A%20inline%2Dblock%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dline%20%7B%0Apadding%3A%200%3B%0Aposition%3A%20absolute%3B%0Awidth%3A%200%3B%0Aborder%2Dleft%2Dwidth%3A%201px%3B%0Aborder%2Dleft%2Dstyle%3A%20solid%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ditem%2Dcontent%20%7B%0Awhite%2Dspace%3A%20nowrap%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Apadding%3A%205px%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2DonUpdateTime%2Dtooltip%20%7B%0Aposition%3A%20absolute%3B%0Abackground%3A%20%234f81bd%3B%0Acolor%3A%20white%3B%0Awidth%3A%20200px%3B%0Atext%2Dalign%3A%20center%3B%0Awhite%2Dspace%3A%20nowrap%3B%0Apadding%3A%205px%3B%0Aborder%2Dradius%3A%201px%3B%0Atransition%3A%200%2E4s%3B%0A%2Do%2Dtransition%3A%200%2E4s%3B%0A%2Dmoz%2Dtransition%3A%200%2E4s%3B%0A%2Dwebkit%2Dtransition%3A%200%2E4s%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%2C%20%2Evis%2Ditem%20%2Evis%2Ddelete%2Drtl%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A%200px%3B%0Awidth%3A%2024px%3B%0Aheight%3A%2024px%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Apadding%3A%200px%205px%3B%0Acursor%3A%20pointer%3B%0A%2Dwebkit%2Dtransition%3A%20background%200%2E2s%20linear%3B%0A%2Dmoz%2Dtransition%3A%20background%200%2E2s%20linear%3B%0A%2Dms%2Dtransition%3A%20background%200%2E2s%20linear%3B%0A%2Do%2Dtransition%3A%20background%200%2E2s%20linear%3B%0Atransition%3A%20background%200%2E2s%20linear%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%20%7B%0Aright%3A%20%2D24px%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%2Drtl%20%7B%0Aleft%3A%20%2D24px%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%3Aafter%2C%20%2Evis%2Ditem%20%2Evis%2Ddelete%2Drtl%3Aafter%20%7B%0Acontent%3A%20%22%5C00D7%22%3B%20%0Acolor%3A%20red%3B%0Afont%2Dfamily%3A%20arial%2C%20sans%2Dserif%3B%0Afont%2Dsize%3A%2022px%3B%0Afont%2Dweight%3A%20bold%3B%0A%2Dwebkit%2Dtransition%3A%20color%200%2E2s%20linear%3B%0A%2Dmoz%2Dtransition%3A%20color%200%2E2s%20linear%3B%0A%2Dms%2Dtransition%3A%20color%200%2E2s%20linear%3B%0A%2Do%2Dtransition%3A%20color%200%2E2s%20linear%3B%0Atransition%3A%20color%200%2E2s%20linear%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%3Ahover%2C%20%2Evis%2Ditem%20%2Evis%2Ddelete%2Drtl%3Ahover%20%7B%0Abackground%3A%20red%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%3Ahover%3Aafter%2C%20%2Evis%2Ditem%20%2Evis%2Ddelete%2Drtl%3Ahover%3Aafter%20%7B%0Acolor%3A%20white%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddrag%2Dcenter%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Atop%3A%200%3B%0Aleft%3A%200px%3B%0Acursor%3A%20move%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Drange%20%2Evis%2Ddrag%2Dleft%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%2024px%3B%0Amax%2Dwidth%3A%2020%25%3B%0Amin%2Dwidth%3A%202px%3B%0Aheight%3A%20100%25%3B%0Atop%3A%200%3B%0Aleft%3A%20%2D4px%3B%0Acursor%3A%20w%2Dresize%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Drange%20%2Evis%2Ddrag%2Dright%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%2024px%3B%0Amax%2Dwidth%3A%2020%25%3B%0Amin%2Dwidth%3A%202px%3B%0Aheight%3A%20100%25%3B%0Atop%3A%200%3B%0Aright%3A%20%2D4px%3B%0Acursor%3A%20e%2Dresize%3B%0A%7D%0A%2Evis%2Drange%2Evis%2Ditem%2Evis%2Dreadonly%20%2Evis%2Ddrag%2Dleft%2C%0A%2Evis%2Drange%2Evis%2Ditem%2Evis%2Dreadonly%20%2Evis%2Ddrag%2Dright%20%7B%0Acursor%3A%20auto%3B%0A%7D%0A%2Evis%2Ditemset%20%7B%0Aposition%3A%20relative%3B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A%2Evis%2Ditemset%20%2Evis%2Dbackground%2C%0A%2Evis%2Ditemset%20%2Evis%2Dforeground%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Aoverflow%3A%20visible%3B%0A%7D%0A%2Evis%2Daxis%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%200%3B%0Aleft%3A%200%3B%0Az%2Dindex%3A%201%3B%0A%7D%0A%2Evis%2Dforeground%20%2Evis%2Dgroup%20%7B%0Aposition%3A%20relative%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Aborder%2Dbottom%3A%201px%20solid%20%23bfbfbf%3B%0A%7D%0A%2Evis%2Dforeground%20%2Evis%2Dgroup%3Alast%2Dchild%20%7B%0Aborder%2Dbottom%3A%20none%3B%0A%7D%0A%2Evis%2Dnesting%2Dgroup%20%7B%0Acursor%3A%20pointer%3B%0A%7D%0A%2Evis%2Dnested%2Dgroup%20%7B%0Abackground%3A%20%23f5f5f5%3B%0A%7D%0A%2Evis%2Dlabel%2Evis%2Dnesting%2Dgroup%2Eexpanded%3Abefore%20%7B%0Acontent%3A%20%22%5C25BC%22%3B%0A%7D%0A%2Evis%2Dlabel%2Evis%2Dnesting%2Dgroup%2Ecollapsed%2Drtl%3Abefore%20%7B%0Acontent%3A%20%22%5C25C0%22%3B%0A%7D%0A%2Evis%2Dlabel%2Evis%2Dnesting%2Dgroup%2Ecollapsed%3Abefore%20%7B%0Acontent%3A%20%22%5C25B6%22%3B%0A%7D%0A%2Evis%2Doverlay%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A%200%3B%0Aleft%3A%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Az%2Dindex%3A%2010%3B%0A%7D%0A%2Evis%2Dlabelset%20%7B%0Aposition%3A%20relative%3B%0Aoverflow%3A%20hidden%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%20%7B%0Aposition%3A%20relative%3B%0Aleft%3A%200%3B%0Atop%3A%200%3B%0Awidth%3A%20100%25%3B%0Acolor%3A%20%234d4d4d%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%20%7B%0Aborder%2Dbottom%3A%201px%20solid%20%23bfbfbf%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%2Edraggable%20%7B%0Acursor%3A%20pointer%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%3Alast%2Dchild%20%7B%0Aborder%2Dbottom%3A%20none%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%20%2Evis%2Dinner%20%7B%0Adisplay%3A%20inline%2Dblock%3B%0Apadding%3A%205px%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%20%2Evis%2Dinner%2Evis%2Dhidden%20%7B%0Apadding%3A%200%3B%0A%7D%0A%2Evis%2Dpanel%20%7B%0Aposition%3A%20absolute%3B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dcenter%2C%0A%2Evis%2Dpanel%2Evis%2Dleft%2C%0A%2Evis%2Dpanel%2Evis%2Dright%2C%0A%2Evis%2Dpanel%2Evis%2Dtop%2C%0A%2Evis%2Dpanel%2Evis%2Dbottom%20%7B%0Aborder%3A%201px%20%23bfbfbf%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dcenter%2C%0A%2Evis%2Dpanel%2Evis%2Dleft%2C%0A%2Evis%2Dpanel%2Evis%2Dright%20%7B%0Aborder%2Dtop%2Dstyle%3A%20solid%3B%0Aborder%2Dbottom%2Dstyle%3A%20solid%3B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2Evis%2Dleft%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%2C%20%2Evis%2Dright%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%20%7B%0Aheight%3A%20100%25%3B%0Aoverflow%2Dx%3A%20hidden%3B%0Aoverflow%2Dy%3A%20scroll%3B%0A%7D%20%2Evis%2Dleft%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%20%7B%0Adirection%3A%20rtl%3B%0A%7D%0A%2Evis%2Dleft%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%20%2Evis%2Dcontent%20%7B%0Adirection%3A%20ltr%3B%0A%7D%0A%2Evis%2Dright%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%20%7B%0Adirection%3A%20ltr%3B%0A%7D%0A%2Evis%2Dright%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%20%2Evis%2Dcontent%20%7B%0Adirection%3A%20rtl%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dcenter%2C%0A%2Evis%2Dpanel%2Evis%2Dtop%2C%0A%2Evis%2Dpanel%2Evis%2Dbottom%20%7B%0Aborder%2Dleft%2Dstyle%3A%20solid%3B%0Aborder%2Dright%2Dstyle%3A%20solid%3B%0A%7D%0A%2Evis%2Dbackground%20%7B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2Evis%2Dpanel%20%3E%20%2Evis%2Dcontent%20%7B%0Aposition%3A%20relative%3B%0A%7D%0A%2Evis%2Dpanel%20%2Evis%2Dshadow%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%201px%3B%0Abox%2Dshadow%3A%200%200%2010px%20rgba%280%2C0%2C0%2C0%2E8%29%3B%0A%0A%7D%0A%2Evis%2Dpanel%20%2Evis%2Dshadow%2Evis%2Dtop%20%7B%0Atop%3A%20%2D1px%3B%0Aleft%3A%200%3B%0A%7D%0A%2Evis%2Dpanel%20%2Evis%2Dshadow%2Evis%2Dbottom%20%7B%0Abottom%3A%20%2D1px%3B%0Aleft%3A%200%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup0%20%7B%0Afill%3A%234f81bd%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%234f81bd%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup1%20%7B%0Afill%3A%23f79646%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%23f79646%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup2%20%7B%0Afill%3A%20%238c51cf%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%238c51cf%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup3%20%7B%0Afill%3A%20%2375c841%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%2375c841%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup4%20%7B%0Afill%3A%20%23ff0100%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%23ff0100%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup5%20%7B%0Afill%3A%20%2337d8e6%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%2337d8e6%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup6%20%7B%0Afill%3A%20%23042662%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%23042662%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup7%20%7B%0Afill%3A%2300ff26%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%2300ff26%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup8%20%7B%0Afill%3A%23ff00ff%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%23ff00ff%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup9%20%7B%0Afill%3A%20%238f3938%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%238f3938%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Dfill%20%7B%0Afill%2Dopacity%3A0%2E1%3B%0Astroke%3A%20none%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Dbar%20%7B%0Afill%2Dopacity%3A0%2E5%3B%0Astroke%2Dwidth%3A1px%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Dpoint%20%7B%0Astroke%2Dwidth%3A2px%3B%0Afill%2Dopacity%3A1%2E0%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Dlegend%2Dbackground%20%7B%0Astroke%2Dwidth%3A1px%3B%0Afill%2Dopacity%3A0%2E9%3B%0Afill%3A%20%23ffffff%3B%0Astroke%3A%20%23c2c2c2%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Doutline%20%7B%0Astroke%2Dwidth%3A1px%3B%0Afill%2Dopacity%3A1%3B%0Afill%3A%20%23ffffff%3B%0Astroke%3A%20%23e5e5e5%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Dicon%2Dfill%20%7B%0Afill%2Dopacity%3A0%2E3%3B%0Astroke%3A%20none%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%7B%0Aposition%3A%20relative%3B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%2Evis%2Dforeground%20%7B%0Atop%3A%200%3B%0Aleft%3A%200%3B%0Awidth%3A%20100%25%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%2Evis%2Dbackground%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A%200%3B%0Aleft%3A%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dtext%20%7B%0Aposition%3A%20absolute%3B%0Acolor%3A%20%234d4d4d%3B%0Apadding%3A%203px%3B%0Aoverflow%3A%20hidden%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Awhite%2Dspace%3A%20nowrap%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dtext%2Evis%2Dmeasure%20%7B%0Aposition%3A%20absolute%3B%0Apadding%2Dleft%3A%200%3B%0Apadding%2Dright%3A%200%3B%0Amargin%2Dleft%3A%200%3B%0Amargin%2Dright%3A%200%3B%0Avisibility%3A%20hidden%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dgrid%2Evis%2Dvertical%20%7B%0Aposition%3A%20absolute%3B%0Aborder%2Dleft%3A%201px%20solid%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dgrid%2Evis%2Dvertical%2Drtl%20%7B%0Aposition%3A%20absolute%3B%0Aborder%2Dright%3A%201px%20solid%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dgrid%2Evis%2Dminor%20%7B%0Aborder%2Dcolor%3A%20%23e5e5e5%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dgrid%2Evis%2Dmajor%20%7B%0Aborder%2Dcolor%3A%20%23bfbfbf%3B%0A%7D%0A%2Evis%2Dtimeline%20%7B%0Aposition%3A%20relative%3B%0Aborder%3A%201px%20solid%20%23bfbfbf%3B%0Aoverflow%3A%20hidden%3B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoqCiAqIHZpcy5qcwogKiBodHRwczovL2dpdGh1Yi5jb20vYWxtZW5kZS92aXMKICoKICogQSBkeW5hbWljLCBicm93c2VyLWJhc2VkIHZpc3VhbGl6YXRpb24gbGlicmFyeS4KICoKICogQHZlcnNpb24gNC4yMC4wCiAqIEBkYXRlICAgIDIwMTctMDUtMjEKICoKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTcgQWxtZW5kZSBCLlYsIGh0dHA6Ly9hbG1lbmRlLmNvbQogKgogKiBWaXMuanMgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciBib3RoCiAqCiAqICogVGhlIEFwYWNoZSAyLjAgTGljZW5zZQogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBhbmQKICoKICogKiBUaGUgTUlUIExpY2Vuc2UKICogICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqCiAqIFZpcy5qcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCiAqLwoidXNlIHN0cmljdCI7IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMudmlzPWUoKTp0LnZpcz1lKCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShvKXtpZihpW29dKXJldHVybiBpW29dLmV4cG9ydHM7dmFyIG49aVtvXT17ZXhwb3J0czp7fSxpZDpvLGxvYWRlZDohMX07cmV0dXJuIHRbb10uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsZSksbi5sb2FkZWQ9ITAsbi5leHBvcnRzfXZhciBpPXt9O3JldHVybiBlLm09dCxlLmM9aSxlLnA9IiIsZSgwKX0oW2Z1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDEpO28uZXh0ZW5kKGUsaSg4NykpLG8uZXh0ZW5kKGUsaSgxMTYpKSxvLmV4dGVuZChlLGkoMTU4KSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX12YXIgbj1pKDIpLHM9byhuKSxyPWkoNTUpLGE9byhyKSxoPWkoNTgpLGQ9byhoKSxsPWkoNjIpLHU9byhsKSxjPWkoODIpLHA9aSg4Nik7ZS5pc051bWJlcj1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIE51bWJlcnx8Im51bWJlciI9PXR5cGVvZiB0fSxlLnJlY3Vyc2l2ZURPTURlbGV0ZT1mdW5jdGlvbih0KXtpZih0KWZvcig7ITA9PT10Lmhhc0NoaWxkTm9kZXMoKTspZS5yZWN1cnNpdmVET01EZWxldGUodC5maXJzdENoaWxkKSx0LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCl9LGUuZ2l2ZVJhbmdlPWZ1bmN0aW9uKHQsZSxpLG8pe2lmKGU9PXQpcmV0dXJuLjU7dmFyIG49MS8oZS10KTtyZXR1cm4gTWF0aC5tYXgoMCwoby10KSpuKX0sZS5pc1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFN0cmluZ3x8InN0cmluZyI9PXR5cGVvZiB0fSxlLmlzRGF0ZT1mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4hMDtpZihlLmlzU3RyaW5nKHQpKXtpZihmLmV4ZWModCkpcmV0dXJuITA7aWYoIWlzTmFOKERhdGUucGFyc2UodCkpKXJldHVybiEwfXJldHVybiExfSxlLnJhbmRvbVVVSUQ9ZnVuY3Rpb24oKXtyZXR1cm4gcC52NCgpfSxlLmFzc2lnbkFsbEtleXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiYib2JqZWN0IiE9PSgwLHUuZGVmYXVsdCkodFtpXSkmJih0W2ldPWUpfSxlLmZpbGxJZkRlZmluZWQ9ZnVuY3Rpb24odCxpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO2Zvcih2YXIgbiBpbiB0KXZvaWQgMCE9PWlbbl0mJigib2JqZWN0IiE9PSgwLHUuZGVmYXVsdCkoaVtuXSk/dm9pZCAwIT09aVtuXSYmbnVsbCE9PWlbbl18fHZvaWQgMD09PXRbbl18fCEwIT09bz90W25dPWlbbl06ZGVsZXRlIHRbbl06Im9iamVjdCI9PT0oMCx1LmRlZmF1bHQpKHRbbl0pJiZlLmZpbGxJZkRlZmluZWQodFtuXSxpW25dLG8pKX0sZS5wcm90b0V4dGVuZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBvPWFyZ3VtZW50c1tpXTtmb3IodmFyIG4gaW4gbyl0W25dPW9bbl19cmV0dXJuIHR9LGUuZXh0ZW5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIG89YXJndW1lbnRzW2ldO2Zvcih2YXIgbiBpbiBvKW8uaGFzT3duUHJvcGVydHkobikmJih0W25dPW9bbl0pfXJldHVybiB0fSxlLnNlbGVjdGl2ZUV4dGVuZD1mdW5jdGlvbih0LGUsaSl7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJBcnJheSB3aXRoIHByb3BlcnR5IG5hbWVzIGV4cGVjdGVkIGFzIGZpcnN0IGFyZ3VtZW50Iik7Zm9yKHZhciBvPTI7bzxhcmd1bWVudHMubGVuZ3RoO28rKylmb3IodmFyIG49YXJndW1lbnRzW29dLHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI9dFtzXTtuJiZuLmhhc093blByb3BlcnR5KHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sZS5zZWxlY3RpdmVEZWVwRXh0ZW5kPWZ1bmN0aW9uKHQsaSxvKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdO2lmKEFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGRlZXBFeHRlbmQiKTtmb3IodmFyIHM9MjtzPGFyZ3VtZW50cy5sZW5ndGg7cysrKWZvcih2YXIgcj1hcmd1bWVudHNbc10sYT0wO2E8dC5sZW5ndGg7YSsrKXt2YXIgaD10W2FdO2lmKHIuaGFzT3duUHJvcGVydHkoaCkpaWYob1toXSYmb1toXS5jb25zdHJ1Y3Rvcj09PU9iamVjdCl2b2lkIDA9PT1pW2hdJiYoaVtoXT17fSksaVtoXS5jb25zdHJ1Y3Rvcj09PU9iamVjdD9lLmRlZXBFeHRlbmQoaVtoXSxvW2hdLCExLG4pOm51bGw9PT1vW2hdJiZ2b2lkIDAhPT1pW2hdJiYhMD09PW4/ZGVsZXRlIGlbaF06aVtoXT1vW2hdO2Vsc2V7aWYoQXJyYXkuaXNBcnJheShvW2hdKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZGVlcEV4dGVuZCIpO251bGw9PT1vW2hdJiZ2b2lkIDAhPT1pW2hdJiYhMD09PW4/ZGVsZXRlIGlbaF06aVtoXT1vW2hdfX1yZXR1cm4gaX0sZS5zZWxlY3RpdmVOb3REZWVwRXh0ZW5kPWZ1bmN0aW9uKHQsaSxvKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdO2lmKEFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGRlZXBFeHRlbmQiKTtmb3IodmFyIHMgaW4gbylpZihvLmhhc093blByb3BlcnR5KHMpJiYtMT09dC5pbmRleE9mKHMpKWlmKG9bc10mJm9bc10uY29uc3RydWN0b3I9PT1PYmplY3Qpdm9pZCAwPT09aVtzXSYmKGlbc109e30pLGlbc10uY29uc3RydWN0b3I9PT1PYmplY3Q/ZS5kZWVwRXh0ZW5kKGlbc10sb1tzXSk6bnVsbD09PW9bc10mJnZvaWQgMCE9PWlbc10mJiEwPT09bj9kZWxldGUgaVtzXTppW3NdPW9bc107ZWxzZSBpZihBcnJheS5pc0FycmF5KG9bc10pKXtpW3NdPVtdO2Zvcih2YXIgcj0wO3I8b1tzXS5sZW5ndGg7cisrKWlbc10ucHVzaChvW3NdW3JdKX1lbHNlIG51bGw9PT1vW3NdJiZ2b2lkIDAhPT1pW3NdJiYhMD09PW4/ZGVsZXRlIGlbc106aVtzXT1vW3NdO3JldHVybiBpfSxlLmRlZXBFeHRlbmQ9ZnVuY3Rpb24odCxpLG8sbil7Zm9yKHZhciBzIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShzKXx8ITA9PT1vKWlmKGlbc10mJmlbc10uY29uc3RydWN0b3I9PT1PYmplY3Qpdm9pZCAwPT09dFtzXSYmKHRbc109e30pLHRbc10uY29uc3RydWN0b3I9PT1PYmplY3Q/ZS5kZWVwRXh0ZW5kKHRbc10saVtzXSxvKTpudWxsPT09aVtzXSYmdm9pZCAwIT09dFtzXSYmITA9PT1uP2RlbGV0ZSB0W3NdOnRbc109aVtzXTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoaVtzXSkpe3Rbc109W107Zm9yKHZhciByPTA7cjxpW3NdLmxlbmd0aDtyKyspdFtzXS5wdXNoKGlbc11bcl0pfWVsc2UgbnVsbD09PWlbc10mJnZvaWQgMCE9PXRbc10mJiEwPT09bj9kZWxldGUgdFtzXTp0W3NdPWlbc107cmV0dXJuIHR9LGUuZXF1YWxBcnJheT1mdW5jdGlvbih0LGUpe2lmKHQubGVuZ3RoIT1lLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGk9MCxvPXQubGVuZ3RoO2k8bztpKyspaWYodFtpXSE9ZVtpXSlyZXR1cm4hMTtyZXR1cm4hMH0sZS5jb252ZXJ0PWZ1bmN0aW9uKHQsaSl7dmFyIG87aWYodm9pZCAwIT09dCl7aWYobnVsbD09PXQpcmV0dXJuIG51bGw7aWYoIWkpcmV0dXJuIHQ7aWYoInN0cmluZyIhPXR5cGVvZiBpJiYhKGkgaW5zdGFuY2VvZiBTdHJpbmcpKXRocm93IG5ldyBFcnJvcigiVHlwZSBtdXN0IGJlIGEgc3RyaW5nIik7c3dpdGNoKGkpe2Nhc2UiYm9vbGVhbiI6Y2FzZSJCb29sZWFuIjpyZXR1cm4gQm9vbGVhbih0KTtjYXNlIm51bWJlciI6Y2FzZSJOdW1iZXIiOnJldHVybiBlLmlzU3RyaW5nKHQpJiYhaXNOYU4oRGF0ZS5wYXJzZSh0KSk/Yyh0KS52YWx1ZU9mKCk6TnVtYmVyKHQudmFsdWVPZigpKTtjYXNlInN0cmluZyI6Y2FzZSJTdHJpbmciOnJldHVybiBTdHJpbmcodCk7Y2FzZSJEYXRlIjppZihlLmlzTnVtYmVyKHQpKXJldHVybiBuZXcgRGF0ZSh0KTtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gbmV3IERhdGUodC52YWx1ZU9mKCkpO2lmKGMuaXNNb21lbnQodCkpcmV0dXJuIG5ldyBEYXRlKHQudmFsdWVPZigpKTtpZihlLmlzU3RyaW5nKHQpKXJldHVybiBvPWYuZXhlYyh0KSxvP25ldyBEYXRlKE51bWJlcihvWzFdKSk6YyhuZXcgRGF0ZSh0KSkudG9EYXRlKCk7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29udmVydCBvYmplY3Qgb2YgdHlwZSAiK2UuZ2V0VHlwZSh0KSsiIHRvIHR5cGUgRGF0ZSIpO2Nhc2UiTW9tZW50IjppZihlLmlzTnVtYmVyKHQpKXJldHVybiBjKHQpO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBjKHQudmFsdWVPZigpKTtpZihjLmlzTW9tZW50KHQpKXJldHVybiBjKHQpO2lmKGUuaXNTdHJpbmcodCkpcmV0dXJuIG89Zi5leGVjKHQpLGMobz9OdW1iZXIob1sxXSk6dCk7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29udmVydCBvYmplY3Qgb2YgdHlwZSAiK2UuZ2V0VHlwZSh0KSsiIHRvIHR5cGUgRGF0ZSIpO2Nhc2UiSVNPRGF0ZSI6aWYoZS5pc051bWJlcih0KSlyZXR1cm4gbmV3IERhdGUodCk7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIHQudG9JU09TdHJpbmcoKTtpZihjLmlzTW9tZW50KHQpKXJldHVybiB0LnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7aWYoZS5pc1N0cmluZyh0KSlyZXR1cm4gbz1mLmV4ZWModCksbz9uZXcgRGF0ZShOdW1iZXIob1sxXSkpLnRvSVNPU3RyaW5nKCk6Yyh0KS5mb3JtYXQoKTt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb252ZXJ0IG9iamVjdCBvZiB0eXBlICIrZS5nZXRUeXBlKHQpKyIgdG8gdHlwZSBJU09EYXRlIik7Y2FzZSJBU1BEYXRlIjppZihlLmlzTnVtYmVyKHQpKXJldHVybiIvRGF0ZSgiK3QrIikvIjtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4iL0RhdGUoIit0LnZhbHVlT2YoKSsiKS8iO2lmKGUuaXNTdHJpbmcodCkpe289Zi5leGVjKHQpO3JldHVybiIvRGF0ZSgiKyhvP25ldyBEYXRlKE51bWJlcihvWzFdKSkudmFsdWVPZigpOm5ldyBEYXRlKHQpLnZhbHVlT2YoKSkrIikvIn10aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb252ZXJ0IG9iamVjdCBvZiB0eXBlICIrZS5nZXRUeXBlKHQpKyIgdG8gdHlwZSBBU1BEYXRlIik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdHlwZSAiJytpKyciJyl9fX07dmFyIGY9L15cLz9EYXRlXCgoXC0/XGQrKS9pO2UuZ2V0VHlwZT1mdW5jdGlvbih0KXt2YXIgZT12b2lkIDA9PT10PyJ1bmRlZmluZWQiOigwLHUuZGVmYXVsdCkodCk7cmV0dXJuIm9iamVjdCI9PWU/bnVsbD09PXQ/Im51bGwiOnQgaW5zdGFuY2VvZiBCb29sZWFuPyJCb29sZWFuIjp0IGluc3RhbmNlb2YgTnVtYmVyPyJOdW1iZXIiOnQgaW5zdGFuY2VvZiBTdHJpbmc/IlN0cmluZyI6QXJyYXkuaXNBcnJheSh0KT8iQXJyYXkiOnQgaW5zdGFuY2VvZiBEYXRlPyJEYXRlIjoiT2JqZWN0IjoibnVtYmVyIj09ZT8iTnVtYmVyIjoiYm9vbGVhbiI9PWU/IkJvb2xlYW4iOiJzdHJpbmciPT1lPyJTdHJpbmciOnZvaWQgMD09PWU/InVuZGVmaW5lZCI6ZX0sZS5jb3B5QW5kRXh0ZW5kQXJyYXk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9W10sbz0wO288dC5sZW5ndGg7bysrKWkucHVzaCh0W29dKTtyZXR1cm4gaS5wdXNoKGUpLGl9LGUuY29weUFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspZS5wdXNoKHRbaV0pO3JldHVybiBlfSxlLmdldEFic29sdXRlTGVmdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSxlLmdldEFic29sdXRlUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHR9LGUuZ2V0QWJzb2x1dGVUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wfSxlLmFkZENsYXNzTmFtZT1mdW5jdGlvbih0LGUpe3ZhciBpPXQuY2xhc3NOYW1lLnNwbGl0KCIgIiksbz1lLnNwbGl0KCIgIik7aT1pLmNvbmNhdChvLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gaS5pbmRleE9mKHQpPDB9KSksdC5jbGFzc05hbWU9aS5qb2luKCIgIil9LGUucmVtb3ZlQ2xhc3NOYW1lPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5jbGFzc05hbWUuc3BsaXQoIiAiKSxvPWUuc3BsaXQoIiAiKTtpPWkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBvLmluZGV4T2YodCk8MH0pLHQuY2xhc3NOYW1lPWkuam9pbigiICIpfSxlLmZvckVhY2g9ZnVuY3Rpb24odCxlKXt2YXIgaSxvO2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKGk9MCxvPXQubGVuZ3RoO2k8bztpKyspZSh0W2ldLGksdCk7ZWxzZSBmb3IoaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJmUodFtpXSxpLHQpfSxlLnRvQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciBpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmZS5wdXNoKHRbaV0pO3JldHVybiBlfSxlLnVwZGF0ZVByb3BlcnR5PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdFtlXSE9PWkmJih0W2VdPWksITApfSxlLnRocm90dGxlPWZ1bmN0aW9uKHQpe3ZhciBlPSExO3JldHVybiBmdW5jdGlvbigpe2V8fChlPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2U9ITEsdCgpfSkpfX0sZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSxpLG8pe3QuYWRkRXZlbnRMaXN0ZW5lcj8odm9pZCAwPT09byYmKG89ITEpLCJtb3VzZXdoZWVsIj09PWUmJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpPj0wJiYoZT0iRE9NTW91c2VTY3JvbGwiKSx0LmFkZEV2ZW50TGlzdGVuZXIoZSxpLG8pKTp0LmF0dGFjaEV2ZW50KCJvbiIrZSxpKX0sZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSxpLG8pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcj8odm9pZCAwPT09byYmKG89ITEpLCJtb3VzZXdoZWVsIj09PWUmJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpPj0wJiYoZT0iRE9NTW91c2VTY3JvbGwiKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxpLG8pKTp0LmRldGFjaEV2ZW50KCJvbiIrZSxpKX0sZS5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbih0KXt0fHwodD13aW5kb3cuZXZlbnQpLHQucHJldmVudERlZmF1bHQ/dC5wcmV2ZW50RGVmYXVsdCgpOnQucmV0dXJuVmFsdWU9ITF9LGUuZ2V0VGFyZ2V0PWZ1bmN0aW9uKHQpe3R8fCh0PXdpbmRvdy5ldmVudCk7dmFyIGU7cmV0dXJuIHQudGFyZ2V0P2U9dC50YXJnZXQ6dC5zcmNFbGVtZW50JiYoZT10LnNyY0VsZW1lbnQpLHZvaWQgMCE9ZS5ub2RlVHlwZSYmMz09ZS5ub2RlVHlwZSYmKGU9ZS5wYXJlbnROb2RlKSxlfSxlLmhhc1BhcmVudD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10O2k7KXtpZihpPT09ZSlyZXR1cm4hMDtpPWkucGFyZW50Tm9kZX1yZXR1cm4hMX0sZS5vcHRpb249e30sZS5vcHRpb24uYXNCb29sZWFuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoKSksbnVsbCE9dD8wIT10OmV8fG51bGx9LGUub3B0aW9uLmFzTnVtYmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoKSksbnVsbCE9dD9OdW1iZXIodCl8fGV8fG51bGw6ZXx8bnVsbH0sZS5vcHRpb24uYXNTdHJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dCgpKSxudWxsIT10P1N0cmluZyh0KTplfHxudWxsfSxlLm9wdGlvbi5hc1NpemU9ZnVuY3Rpb24odCxpKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dCgpKSxlLmlzU3RyaW5nKHQpP3Q6ZS5pc051bWJlcih0KT90KyJweCI6aXx8bnVsbH0sZS5vcHRpb24uYXNFbGVtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoKSksdHx8ZXx8bnVsbH0sZS5oZXhUb1JHQj1mdW5jdGlvbih0KXt2YXIgZT0vXiM/KFthLWZcZF0pKFthLWZcZF0pKFthLWZcZF0pJC9pO3Q9dC5yZXBsYWNlKGUsZnVuY3Rpb24odCxlLGksbyl7cmV0dXJuIGUrZStpK2krbytvfSk7dmFyIGk9L14jPyhbYS1mXGRdezJ9KShbYS1mXGRdezJ9KShbYS1mXGRdezJ9KSQvaS5leGVjKHQpO3JldHVybiBpP3tyOnBhcnNlSW50KGlbMV0sMTYpLGc6cGFyc2VJbnQoaVsyXSwxNiksYjpwYXJzZUludChpWzNdLDE2KX06bnVsbH0sZS5vdmVycmlkZU9wYWNpdHk9ZnVuY3Rpb24odCxpKXtpZigtMSE9dC5pbmRleE9mKCJyZ2JhIikpcmV0dXJuIHQ7aWYoLTEhPXQuaW5kZXhPZigicmdiIikpe3ZhciBvPXQuc3Vic3RyKHQuaW5kZXhPZigiKCIpKzEpLnJlcGxhY2UoIikiLCIiKS5zcGxpdCgiLCIpO3JldHVybiJyZ2JhKCIrb1swXSsiLCIrb1sxXSsiLCIrb1syXSsiLCIraSsiKSJ9dmFyIG89ZS5oZXhUb1JHQih0KTtyZXR1cm4gbnVsbD09bz90OiJyZ2JhKCIrby5yKyIsIitvLmcrIiwiK28uYisiLCIraSsiKSJ9LGUuUkdCVG9IZXg9ZnVuY3Rpb24odCxlLGkpe3JldHVybiIjIisoKDE8PDI0KSsodDw8MTYpKyhlPDw4KStpKS50b1N0cmluZygxNikuc2xpY2UoMSl9LGUucGFyc2VDb2xvcj1mdW5jdGlvbih0KXt2YXIgaTtpZighMD09PWUuaXNTdHJpbmcodCkpe2lmKCEwPT09ZS5pc1ZhbGlkUkdCKHQpKXt2YXIgbz10LnN1YnN0cig0KS5zdWJzdHIoMCx0Lmxlbmd0aC01KS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VJbnQodCl9KTt0PWUuUkdCVG9IZXgob1swXSxvWzFdLG9bMl0pfWlmKCEwPT09ZS5pc1ZhbGlkSGV4KHQpKXt2YXIgbj1lLmhleFRvSFNWKHQpLHM9e2g6bi5oLHM6Ljgqbi5zLHY6TWF0aC5taW4oMSwxLjAyKm4udil9LHI9e2g6bi5oLHM6TWF0aC5taW4oMSwxLjI1Km4ucyksdjouOCpuLnZ9LGE9ZS5IU1ZUb0hleChyLmgsci5zLHIudiksaD1lLkhTVlRvSGV4KHMuaCxzLnMscy52KTtpPXtiYWNrZ3JvdW5kOnQsYm9yZGVyOmEsaGlnaGxpZ2h0OntiYWNrZ3JvdW5kOmgsYm9yZGVyOmF9LGhvdmVyOntiYWNrZ3JvdW5kOmgsYm9yZGVyOmF9fX1lbHNlIGk9e2JhY2tncm91bmQ6dCxib3JkZXI6dCxoaWdobGlnaHQ6e2JhY2tncm91bmQ6dCxib3JkZXI6dH0saG92ZXI6e2JhY2tncm91bmQ6dCxib3JkZXI6dH19fWVsc2UgaT17fSxpLmJhY2tncm91bmQ9dC5iYWNrZ3JvdW5kfHx2b2lkIDAsaS5ib3JkZXI9dC5ib3JkZXJ8fHZvaWQgMCxlLmlzU3RyaW5nKHQuaGlnaGxpZ2h0KT9pLmhpZ2hsaWdodD17Ym9yZGVyOnQuaGlnaGxpZ2h0LGJhY2tncm91bmQ6dC5oaWdobGlnaHR9OihpLmhpZ2hsaWdodD17fSxpLmhpZ2hsaWdodC5iYWNrZ3JvdW5kPXQuaGlnaGxpZ2h0JiZ0LmhpZ2hsaWdodC5iYWNrZ3JvdW5kfHx2b2lkIDAsaS5oaWdobGlnaHQuYm9yZGVyPXQuaGlnaGxpZ2h0JiZ0LmhpZ2hsaWdodC5ib3JkZXJ8fHZvaWQgMCksZS5pc1N0cmluZyh0LmhvdmVyKT9pLmhvdmVyPXtib3JkZXI6dC5ob3ZlcixiYWNrZ3JvdW5kOnQuaG92ZXJ9OihpLmhvdmVyPXt9LGkuaG92ZXIuYmFja2dyb3VuZD10LmhvdmVyJiZ0LmhvdmVyLmJhY2tncm91bmR8fHZvaWQgMCxpLmhvdmVyLmJvcmRlcj10LmhvdmVyJiZ0LmhvdmVyLmJvcmRlcnx8dm9pZCAwKTtyZXR1cm4gaX0sZS5SR0JUb0hTVj1mdW5jdGlvbih0LGUsaSl7dC89MjU1LGUvPTI1NSxpLz0yNTU7dmFyIG89TWF0aC5taW4odCxNYXRoLm1pbihlLGkpKSxuPU1hdGgubWF4KHQsTWF0aC5tYXgoZSxpKSk7aWYobz09bilyZXR1cm57aDowLHM6MCx2Om99O3ZhciBzPXQ9PW8/ZS1pOmk9PW8/dC1lOmktdDtyZXR1cm57aDo2MCooKHQ9PW8/MzppPT1vPzE6NSktcy8obi1vKSkvMzYwLHM6KG4tbykvbix2Om59fTt2YXIgbT17c3BsaXQ6ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIHQuc3BsaXQoIjsiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCIiIT10LnRyaW0oKSl7dmFyIGk9dC5zcGxpdCgiOiIpLG89aVswXS50cmltKCksbj1pWzFdLnRyaW0oKTtlW29dPW59fSksZX0sam9pbjpmdW5jdGlvbih0KXtyZXR1cm4oMCxkLmRlZmF1bHQpKHQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZSsiOiAiK3RbZV19KS5qb2luKCI7ICIpfX07ZS5hZGRDc3NUZXh0PWZ1bmN0aW9uKHQsaSl7dmFyIG89bS5zcGxpdCh0LnN0eWxlLmNzc1RleHQpLG49bS5zcGxpdChpKSxzPWUuZXh0ZW5kKG8sbik7dC5zdHlsZS5jc3NUZXh0PW0uam9pbihzKX0sZS5yZW1vdmVDc3NUZXh0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9bS5zcGxpdCh0LnN0eWxlLmNzc1RleHQpLG89bS5zcGxpdChlKTtmb3IodmFyIG4gaW4gbylvLmhhc093blByb3BlcnR5KG4pJiZkZWxldGUgaVtuXTt0LnN0eWxlLmNzc1RleHQ9bS5qb2luKGkpfSxlLkhTVlRvUkdCPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbyxuLHMscj1NYXRoLmZsb29yKDYqdCksYT02KnQtcixoPWkqKDEtZSksZD1pKigxLWEqZSksbD1pKigxLSgxLWEpKmUpO3N3aXRjaChyJTYpe2Nhc2UgMDpvPWksbj1sLHM9aDticmVhaztjYXNlIDE6bz1kLG49aSxzPWg7YnJlYWs7Y2FzZSAyOm89aCxuPWkscz1sO2JyZWFrO2Nhc2UgMzpvPWgsbj1kLHM9aTticmVhaztjYXNlIDQ6bz1sLG49aCxzPWk7YnJlYWs7Y2FzZSA1Om89aSxuPWgscz1kfXJldHVybntyOk1hdGguZmxvb3IoMjU1Km8pLGc6TWF0aC5mbG9vcigyNTUqbiksYjpNYXRoLmZsb29yKDI1NSpzKX19LGUuSFNWVG9IZXg9ZnVuY3Rpb24odCxpLG8pe3ZhciBuPWUuSFNWVG9SR0IodCxpLG8pO3JldHVybiBlLlJHQlRvSGV4KG4ucixuLmcsbi5iKX0sZS5oZXhUb0hTVj1mdW5jdGlvbih0KXt2YXIgaT1lLmhleFRvUkdCKHQpO3JldHVybiBlLlJHQlRvSFNWKGkucixpLmcsaS5iKX0sZS5pc1ZhbGlkSGV4PWZ1bmN0aW9uKHQpe3JldHVybi8oXiNbMC05QS1GXXs2fSQpfCheI1swLTlBLUZdezN9JCkvaS50ZXN0KHQpfSxlLmlzVmFsaWRSR0I9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKCIgIiwiIiksL3JnYlwoKFxkezEsM30pLChcZHsxLDN9KSwoXGR7MSwzfSlcKS9pLnRlc3QodCl9LGUuaXNWYWxpZFJHQkE9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKCIgIiwiIiksL3JnYmFcKChcZHsxLDN9KSwoXGR7MSwzfSksKFxkezEsM30pLCguezEsM30pXCkvaS50ZXN0KHQpfSxlLnNlbGVjdGl2ZUJyaWRnZU9iamVjdD1mdW5jdGlvbih0LGkpe2lmKCJvYmplY3QiPT0odm9pZCAwPT09aT8idW5kZWZpbmVkIjooMCx1LmRlZmF1bHQpKGkpKSl7Zm9yKHZhciBvPSgwLGEuZGVmYXVsdCkoaSksbj0wO248dC5sZW5ndGg7bisrKWkuaGFzT3duUHJvcGVydHkodFtuXSkmJiJvYmplY3QiPT0oMCx1LmRlZmF1bHQpKGlbdFtuXV0pJiYob1t0W25dXT1lLmJyaWRnZU9iamVjdChpW3Rbbl1dKSk7cmV0dXJuIG99cmV0dXJuIG51bGx9LGUuYnJpZGdlT2JqZWN0PWZ1bmN0aW9uKHQpe2lmKCJvYmplY3QiPT0odm9pZCAwPT09dD8idW5kZWZpbmVkIjooMCx1LmRlZmF1bHQpKHQpKSl7dmFyIGk9KDAsYS5kZWZhdWx0KSh0KTtmb3IodmFyIG8gaW4gdCl0Lmhhc093blByb3BlcnR5KG8pJiYib2JqZWN0Ij09KDAsdS5kZWZhdWx0KSh0W29dKSYmKGlbb109ZS5icmlkZ2VPYmplY3QodFtvXSkpO3JldHVybiBpfXJldHVybiBudWxsfSxlLmluc2VydFNvcnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyl7Zm9yKHZhciBvPXRbaV0sbj1pO24+MCYmZShvLHRbbi0xXSk8MDtuLS0pdFtuXT10W24tMV07dFtuXT1vfXJldHVybiB0fSxlLm1lcmdlT3B0aW9ucz1mdW5jdGlvbih0LGUsaSl7dmFyIG89KGFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM10sYXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOnt9KTtpZihudWxsPT09ZVtpXSl0W2ldPSgwLGEuZGVmYXVsdCkob1tpXSk7ZWxzZSBpZih2b2lkIDAhPT1lW2ldKWlmKCJib29sZWFuIj09dHlwZW9mIGVbaV0pdFtpXS5lbmFibGVkPWVbaV07ZWxzZXt2b2lkIDA9PT1lW2ldLmVuYWJsZWQmJih0W2ldLmVuYWJsZWQ9ITApO2Zvcih2YXIgbiBpbiBlW2ldKWVbaV0uaGFzT3duUHJvcGVydHkobikmJih0W2ldW25dPWVbaV1bbl0pfX0sZS5iaW5hcnlTZWFyY2hDdXN0b209ZnVuY3Rpb24odCxlLGksbyl7Zm9yKHZhciBuPTAscz0wLHI9dC5sZW5ndGgtMTtzPD1yJiZuPDFlNDspe3ZhciBhPU1hdGguZmxvb3IoKHMrcikvMiksaD10W2FdLGQ9dm9pZCAwPT09bz9oW2ldOmhbaV1bb10sbD1lKGQpO2lmKDA9PWwpcmV0dXJuIGE7LTE9PWw/cz1hKzE6cj1hLTEsbisrfXJldHVybi0xfSxlLmJpbmFyeVNlYXJjaFZhbHVlPWZ1bmN0aW9uKHQsZSxpLG8sbil7Zm9yKHZhciBzLHIsYSxoLGQ9MCxsPTAsdT10Lmxlbmd0aC0xLG49dm9pZCAwIT1uP246ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09ZT8wOnQ8ZT8tMToxfTtsPD11JiZkPDFlNDspe2lmKGg9TWF0aC5mbG9vciguNSoodStsKSkscz10W01hdGgubWF4KDAsaC0xKV1baV0scj10W2hdW2ldLGE9dFtNYXRoLm1pbih0Lmxlbmd0aC0xLGgrMSldW2ldLDA9PW4ocixlKSlyZXR1cm4gaDtpZihuKHMsZSk8MCYmbihyLGUpPjApcmV0dXJuImJlZm9yZSI9PW8/TWF0aC5tYXgoMCxoLTEpOmg7aWYobihyLGUpPDAmJm4oYSxlKT4wKXJldHVybiJiZWZvcmUiPT1vP2g6TWF0aC5taW4odC5sZW5ndGgtMSxoKzEpO24ocixlKTwwP2w9aCsxOnU9aC0xLGQrK31yZXR1cm4tMX0sZS5lYXNpbmdGdW5jdGlvbnM9e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sZWFzZUluUXVhZDpmdW5jdGlvbih0KXtyZXR1cm4gdCp0fSxlYXNlT3V0UXVhZDpmdW5jdGlvbih0KXtyZXR1cm4gdCooMi10KX0sZWFzZUluT3V0UXVhZDpmdW5jdGlvbih0KXtyZXR1cm4gdDwuNT8yKnQqdDooNC0yKnQpKnQtMX0sZWFzZUluQ3ViaWM6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0fSxlYXNlT3V0Q3ViaWM6ZnVuY3Rpb24odCl7cmV0dXJuLS10KnQqdCsxfSxlYXNlSW5PdXRDdWJpYzpmdW5jdGlvbih0KXtyZXR1cm4gdDwuNT80KnQqdCp0Oih0LTEpKigyKnQtMikqKDIqdC0yKSsxfSxlYXNlSW5RdWFydDpmdW5jdGlvbih0KXtyZXR1cm4gdCp0KnQqdH0sZWFzZU91dFF1YXJ0OmZ1bmN0aW9uKHQpe3JldHVybiAxLSAtLXQqdCp0KnR9LGVhc2VJbk91dFF1YXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0PC41PzgqdCp0KnQqdDoxLTgqLS10KnQqdCp0fSxlYXNlSW5RdWludDpmdW5jdGlvbih0KXtyZXR1cm4gdCp0KnQqdCp0fSxlYXNlT3V0UXVpbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIDErLS10KnQqdCp0KnR9LGVhc2VJbk91dFF1aW50OmZ1bmN0aW9uKHQpe3JldHVybiB0PC41PzE2KnQqdCp0KnQqdDoxKzE2Ki0tdCp0KnQqdCp0fX0sZS5nZXRTY3JvbGxCYXJXaWR0aD1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTt0LnN0eWxlLndpZHRoPSIxMDAlIix0LnN0eWxlLmhlaWdodD0iMjAwcHgiO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iMHB4IixlLnN0eWxlLmxlZnQ9IjBweCIsZS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLGUuc3R5bGUud2lkdGg9IjIwMHB4IixlLnN0eWxlLmhlaWdodD0iMTUwcHgiLGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZS5hcHBlbmRDaGlsZCh0KSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBpPXQub2Zmc2V0V2lkdGg7ZS5zdHlsZS5vdmVyZmxvdz0ic2Nyb2xsIjt2YXIgbz10Lm9mZnNldFdpZHRoO3JldHVybiBpPT1vJiYobz1lLmNsaWVudFdpZHRoKSxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpLGktb30sZS50b3BNb3N0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dm9pZCAwO0FycmF5LmlzQXJyYXkoZSl8fChlPVtlXSk7dmFyIG89ITAsbj0hMSxyPXZvaWQgMDt0cnl7Zm9yKHZhciBhLGg9KDAscy5kZWZhdWx0KSh0KTshKG89KGE9aC5uZXh0KCkpLmRvbmUpO289ITApe3ZhciBkPWEudmFsdWU7aWYoZCl7aT1kW2VbMF1dO2Zvcih2YXIgbD0xO2w8ZS5sZW5ndGg7bCsrKWkmJihpPWlbZVtsXV0pO2lmKHZvaWQgMCE9PWkpYnJlYWt9fX1jYXRjaCh0KXtuPSEwLHI9dH1maW5hbGx5e3RyeXshbyYmaC5yZXR1cm4mJmgucmV0dXJuKCl9ZmluYWxseXtpZihuKXRocm93IHJ9fXJldHVybiBpfX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDMpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSg0KSxpKDUwKSx0LmV4cG9ydHM9aSg1Mil9LGZ1bmN0aW9uKHQsZSxpKXtpKDUpO2Zvcih2YXIgbz1pKDE2KSxuPWkoMjApLHM9aSg4KSxyPWkoNDcpKCJ0b1N0cmluZ1RhZyIpLGE9WyJOb2RlTGlzdCIsIkRPTVRva2VuTGlzdCIsIk1lZGlhTGlzdCIsIlN0eWxlU2hlZXRMaXN0IiwiQ1NTUnVsZUxpc3QiXSxoPTA7aDw1O2grKyl7dmFyIGQ9YVtoXSxsPW9bZF0sdT1sJiZsLnByb3RvdHlwZTt1JiYhdVtyXSYmbih1LHIsZCksc1tkXT1zLkFycmF5fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoNiksbj1pKDcpLHM9aSg4KSxyPWkoOSk7dC5leHBvcnRzPWkoMTMpKEFycmF5LCJBcnJheSIsZnVuY3Rpb24odCxlKXt0aGlzLl90PXIodCksdGhpcy5faT0wLHRoaXMuX2s9ZX0sZnVuY3Rpb24oKXt2YXIgdD10aGlzLl90LGU9dGhpcy5fayxpPXRoaXMuX2krKztyZXR1cm4hdHx8aT49dC5sZW5ndGg/KHRoaXMuX3Q9dm9pZCAwLG4oMSkpOiJrZXlzIj09ZT9uKDAsaSk6InZhbHVlcyI9PWU/bigwLHRbaV0pOm4oMCxbaSx0W2ldXSl9LCJ2YWx1ZXMiKSxzLkFyZ3VtZW50cz1zLkFycmF5LG8oImtleXMiKSxvKCJ2YWx1ZXMiKSxvKCJlbnRyaWVzIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57dmFsdWU6ZSxkb25lOiEhdH19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTApLG49aSgxMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvKG4odCkpfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTEpO3QuZXhwb3J0cz1PYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIlN0cmluZyI9PW8odCk/dC5zcGxpdCgiIik6T2JqZWN0KHQpfX0sZnVuY3Rpb24odCxlKXt2YXIgaT17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkuY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09dCl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNhbGwgbWV0aG9kIG9uICAiK3QpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTQpLG49aSgxNSkscz1pKDMwKSxyPWkoMjApLGE9aSgzMSksaD1pKDgpLGQ9aSgzMiksbD1pKDQ2KSx1PWkoNDgpLGM9aSg0NykoIml0ZXJhdG9yIikscD0hKFtdLmtleXMmJiJuZXh0ImluW10ua2V5cygpKSxmPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSxtLHYsZyx5KXtkKGksZSxtKTt2YXIgYixfLHcseD1mdW5jdGlvbih0KXtpZighcCYmdCBpbiBEKXJldHVybiBEW3RdO3N3aXRjaCh0KXtjYXNlImtleXMiOmNhc2UidmFsdWVzIjpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGkodGhpcyx0KX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpKHRoaXMsdCl9fSxrPWUrIiBJdGVyYXRvciIsTT0idmFsdWVzIj09dixTPSExLEQ9dC5wcm90b3R5cGUsTz1EW2NdfHxEWyJAQGl0ZXJhdG9yIl18fHYmJkRbdl0sQz1PfHx4KHYpLFQ9dj9NP3goImVudHJpZXMiKTpDOnZvaWQgMCxFPSJBcnJheSI9PWU/RC5lbnRyaWVzfHxPOk87aWYoRSYmKHc9dShFLmNhbGwobmV3IHQpKSkhPT1PYmplY3QucHJvdG90eXBlJiYobCh3LGssITApLG98fGEodyxjKXx8cih3LGMsZikpLE0mJk8mJiJ2YWx1ZXMiIT09Ty5uYW1lJiYoUz0hMCxDPWZ1bmN0aW9uKCl7cmV0dXJuIE8uY2FsbCh0aGlzKX0pLG8mJiF5fHwhcCYmIVMmJkRbY118fHIoRCxjLEMpLGhbZV09QyxoW2tdPWYsdilpZihiPXt2YWx1ZXM6TT9DOngoInZhbHVlcyIpLGtleXM6Zz9DOngoImtleXMiKSxlbnRyaWVzOlR9LHkpZm9yKF8gaW4gYilfIGluIER8fHMoRCxfLGJbX10pO2Vsc2UgbihuLlArbi5GKihwfHxTKSxlLGIpO3JldHVybiBifX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ITB9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDE2KSxuPWkoMTcpLHM9aSgxOCkscj1pKDIwKSxhPWZ1bmN0aW9uKHQsZSxpKXt2YXIgaCxkLGwsdT10JmEuRixjPXQmYS5HLHA9dCZhLlMsZj10JmEuUCxtPXQmYS5CLHY9dCZhLlcsZz1jP246bltlXXx8KG5bZV09e30pLHk9Zy5wcm90b3R5cGUsYj1jP286cD9vW2VdOihvW2VdfHx7fSkucHJvdG90eXBlO2MmJihpPWUpO2ZvcihoIGluIGkpKGQ9IXUmJmImJnZvaWQgMCE9PWJbaF0pJiZoIGluIGd8fChsPWQ/YltoXTppW2hdLGdbaF09YyYmImZ1bmN0aW9uIiE9dHlwZW9mIGJbaF0/aVtoXTptJiZkP3MobCxvKTp2JiZiW2hdPT1sP2Z1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsaSxvKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsaSl9cmV0dXJuIG5ldyB0KGUsaSxvKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfShsKTpmJiYiZnVuY3Rpb24iPT10eXBlb2YgbD9zKEZ1bmN0aW9uLmNhbGwsbCk6bCxmJiYoKGcudmlydHVhbHx8KGcudmlydHVhbD17fSkpW2hdPWwsdCZhLlImJnkmJiF5W2hdJiZyKHksaCxsKSkpfTthLkY9MSxhLkc9MixhLlM9NCxhLlA9OCxhLkI9MTYsYS5XPTMyLGEuVT02NCxhLlI9MTI4LHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUpe3ZhciBpPXQuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PU1hdGg/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5NYXRoPT1NYXRoP3NlbGY6RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTsibnVtYmVyIj09dHlwZW9mIF9fZyYmKF9fZz1pKX0sZnVuY3Rpb24odCxlKXt2YXIgaT10LmV4cG9ydHM9e3ZlcnNpb246IjIuNC4wIn07Im51bWJlciI9PXR5cGVvZiBfX2UmJihfX2U9aSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDE5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLGkpe2lmKG8odCksdm9pZCAwPT09ZSlyZXR1cm4gdDtzd2l0Y2goaSl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gdC5jYWxsKGUsaSl9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24oaSxvKXtyZXR1cm4gdC5jYWxsKGUsaSxvKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihpLG8sbil7cmV0dXJuIHQuY2FsbChlLGksbyxuKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24hIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgyMSksbj1pKDI5KTt0LmV4cG9ydHM9aSgyNSk/ZnVuY3Rpb24odCxlLGkpe3JldHVybiBvLmYodCxlLG4oMSxpKSl9OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdFtlXT1pLHR9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgyMiksbj1pKDI0KSxzPWkoMjgpLHI9T2JqZWN0LmRlZmluZVByb3BlcnR5O2UuZj1pKDI1KT9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24odCxlLGkpe2lmKG8odCksZT1zKGUsITApLG8oaSksbil0cnl7cmV0dXJuIHIodCxlLGkpfWNhdGNoKHQpe31pZigiZ2V0ImluIGl8fCJzZXQiaW4gaSl0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkISIpO3JldHVybiJ2YWx1ZSJpbiBpJiYodFtlXT1pLnZhbHVlKSx0fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMjMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighbyh0KSl0aHJvdyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhbiBvYmplY3QhIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/bnVsbCE9PXQ6ImZ1bmN0aW9uIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPSFpKDI1KSYmIWkoMjYpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpKDI3KSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9IWkoMjYpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKHQpe3JldHVybiEwfX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDIzKSxuPWkoMTYpLmRvY3VtZW50LHM9byhuKSYmbyhuLmNyZWF0ZUVsZW1lbnQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcz9uLmNyZWF0ZUVsZW1lbnQodCk6e319fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgyMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIW8odCkpcmV0dXJuIHQ7dmFyIGksbjtpZihlJiYiZnVuY3Rpb24iPT10eXBlb2YoaT10LnRvU3RyaW5nKSYmIW8obj1pLmNhbGwodCkpKXJldHVybiBuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZihpPXQudmFsdWVPZikmJiFvKG49aS5jYWxsKHQpKSlyZXR1cm4gbjtpZighZSYmImZ1bmN0aW9uIj09dHlwZW9mKGk9dC50b1N0cmluZykmJiFvKG49aS5jYWxsKHQpKSlyZXR1cm4gbjt0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmdCksY29uZmlndXJhYmxlOiEoMiZ0KSx3cml0YWJsZTohKDQmdCksdmFsdWU6ZX19fSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPWkoMjApfSxmdW5jdGlvbih0LGUpe3ZhciBpPXt9Lmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBpLmNhbGwodCxlKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDMzKSxuPWkoMjkpLHM9aSg0Nikscj17fTtpKDIwKShyLGkoNDcpKCJpdGVyYXRvciIpLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSx0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLGkpe3QucHJvdG90eXBlPW8ocix7bmV4dDpuKDEsaSl9KSxzKHQsZSsiIEl0ZXJhdG9yIil9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgyMiksbj1pKDM0KSxzPWkoNDQpLHI9aSg0MSkoIklFX1BST1RPIiksYT1mdW5jdGlvbigpe30saD1mdW5jdGlvbigpe3ZhciB0LGU9aSgyNykoImlmcmFtZSIpLG89cy5sZW5ndGg7Zm9yKGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsaSg0NSkuYXBwZW5kQ2hpbGQoZSksZS5zcmM9ImphdmFzY3JpcHQ6Iix0PWUuY29udGVudFdpbmRvdy5kb2N1bWVudCx0Lm9wZW4oKSx0LndyaXRlKCI8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PFwvc2NyaXB0PiIpLHQuY2xvc2UoKSxoPXQuRjtvLS07KWRlbGV0ZSBoLnByb3RvdHlwZVtzW29dXTtyZXR1cm4gaCgpfTt0LmV4cG9ydHM9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24odCxlKXt2YXIgaTtyZXR1cm4gbnVsbCE9PXQ/KGEucHJvdG90eXBlPW8odCksaT1uZXcgYSxhLnByb3RvdHlwZT1udWxsLGlbcl09dCk6aT1oKCksdm9pZCAwPT09ZT9pOm4oaSxlKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDIxKSxuPWkoMjIpLHM9aSgzNSk7dC5leHBvcnRzPWkoMjUpP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKHQsZSl7bih0KTtmb3IodmFyIGkscj1zKGUpLGE9ci5sZW5ndGgsaD0wO2E+aDspby5mKHQsaT1yW2grK10sZVtpXSk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgzNiksbj1pKDQ0KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiBvKHQsbil9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgzMSksbj1pKDkpLHM9aSgzNykoITEpLHI9aSg0MSkoIklFX1BST1RPIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIGksYT1uKHQpLGg9MCxkPVtdO2ZvcihpIGluIGEpaSE9ciYmbyhhLGkpJiZkLnB1c2goaSk7Zm9yKDtlLmxlbmd0aD5oOylvKGEsaT1lW2grK10pJiYofnMoZCxpKXx8ZC5wdXNoKGkpKTtyZXR1cm4gZH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDkpLG49aSgzOCkscz1pKDQwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsaSxyKXt2YXIgYSxoPW8oZSksZD1uKGgubGVuZ3RoKSxsPXMocixkKTtpZih0JiZpIT1pKXtmb3IoO2Q+bDspaWYoKGE9aFtsKytdKSE9YSlyZXR1cm4hMH1lbHNlIGZvcig7ZD5sO2wrKylpZigodHx8bCBpbiBoKSYmaFtsXT09PWkpcmV0dXJuIHR8fGx8fDA7cmV0dXJuIXQmJi0xfX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDM5KSxuPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4wP24obyh0KSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZnVuY3Rpb24odCxlKXt2YXIgaT1NYXRoLmNlaWwsbz1NYXRoLmZsb29yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaXNOYU4odD0rdCk/MDoodD4wP286aSkodCl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgzOSksbj1NYXRoLm1heCxzPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0PW8odCksdDwwP24odCtlLDApOnModCxlKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDQyKSgia2V5cyIpLG49aSg0Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvW3RdfHwob1t0XT1uKHQpKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDE2KSxuPW9bIl9fY29yZS1qc19zaGFyZWRfXyJdfHwob1siX19jb3JlLWpzX3NoYXJlZF9fIl09e30pO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gblt0XXx8KG5bdF09e30pfX0sZnVuY3Rpb24odCxlKXt2YXIgaT0wLG89TWF0aC5yYW5kb20oKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIlN5bWJvbCgiLmNvbmNhdCh2b2lkIDA9PT10PyIiOnQsIilfIiwoKytpK28pLnRvU3RyaW5nKDM2KSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0iY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mIi5zcGxpdCgiLCIpfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPWkoMTYpLmRvY3VtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDIxKS5mLG49aSgzMSkscz1pKDQ3KSgidG9TdHJpbmdUYWciKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLGkpe3QmJiFuKHQ9aT90OnQucHJvdG90eXBlLHMpJiZvKHQscyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmV9KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDQyKSgid2tzIiksbj1pKDQzKSxzPWkoMTYpLlN5bWJvbCxyPSJmdW5jdGlvbiI9PXR5cGVvZiBzOyh0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG9bdF18fChvW3RdPXImJnNbdF18fChyP3M6bikoIlN5bWJvbC4iK3QpKX0pLnN0b3JlPW99LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDMxKSxuPWkoNDkpLHM9aSg0MSkoIklFX1BST1RPIikscj1PYmplY3QucHJvdG90eXBlO3QuZXhwb3J0cz1PYmplY3QuZ2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQpe3JldHVybiB0PW4odCksbyh0LHMpP3Rbc106ImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3ImJnQgaW5zdGFuY2VvZiB0LmNvbnN0cnVjdG9yP3QuY29uc3RydWN0b3IucHJvdG90eXBlOnQgaW5zdGFuY2VvZiBPYmplY3Q/cjpudWxsfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KG8odCkpfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoNTEpKCEwKTtpKDEzKShTdHJpbmcsIlN0cmluZyIsZnVuY3Rpb24odCl7dGhpcy5fdD1TdHJpbmcodCksdGhpcy5faT0wfSxmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fdCxpPXRoaXMuX2k7cmV0dXJuIGk+PWUubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9byhlLGkpLHRoaXMuX2krPXQubGVuZ3RoLHt2YWx1ZTp0LGRvbmU6ITF9KX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgzOSksbj1pKDEyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsaSl7dmFyIHMscixhPVN0cmluZyhuKGUpKSxoPW8oaSksZD1hLmxlbmd0aDtyZXR1cm4gaDwwfHxoPj1kP3Q/IiI6dm9pZCAwOihzPWEuY2hhckNvZGVBdChoKSxzPDU1Mjk2fHxzPjU2MzE5fHxoKzE9PT1kfHwocj1hLmNoYXJDb2RlQXQoaCsxKSk8NTYzMjB8fHI+NTczNDM/dD9hLmNoYXJBdChoKTpzOnQ/YS5zbGljZShoLGgrMik6ci01NjMyMCsocy01NTI5Njw8MTApKzY1NTM2KX19fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgyMiksbj1pKDUzKTt0LmV4cG9ydHM9aSgxNykuZ2V0SXRlcmF0b3I9ZnVuY3Rpb24odCl7dmFyIGU9bih0KTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBUeXBlRXJyb3IodCsiIGlzIG5vdCBpdGVyYWJsZSEiKTtyZXR1cm4gbyhlLmNhbGwodCkpfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoNTQpLG49aSg0NykoIml0ZXJhdG9yIikscz1pKDgpO3QuZXhwb3J0cz1pKDE3KS5nZXRJdGVyYXRvck1ldGhvZD1mdW5jdGlvbih0KXtpZih2b2lkIDAhPXQpcmV0dXJuIHRbbl18fHRbIkBAaXRlcmF0b3IiXXx8c1tvKHQpXX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDExKSxuPWkoNDcpKCJ0b1N0cmluZ1RhZyIpLHM9IkFyZ3VtZW50cyI9PW8oZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKSxyPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319O3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxpLGE7cmV0dXJuIHZvaWQgMD09PXQ/IlVuZGVmaW5lZCI6bnVsbD09PXQ/Ik51bGwiOiJzdHJpbmciPT10eXBlb2YoaT1yKGU9T2JqZWN0KHQpLG4pKT9pOnM/byhlKToiT2JqZWN0Ij09KGE9byhlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDU2KSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe2koNTcpO3ZhciBvPWkoMTcpLk9iamVjdDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gby5jcmVhdGUodCxlKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDE1KTtvKG8uUywiT2JqZWN0Iix7Y3JlYXRlOmkoMzMpfSl9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSg1OSksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKHQsZSxpKXtpKDYwKSx0LmV4cG9ydHM9aSgxNykuT2JqZWN0LmtleXN9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDQ5KSxuPWkoMzUpO2koNjEpKCJrZXlzIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbihvKHQpKX19KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTUpLG49aSgxNykscz1pKDI2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgaT0obi5PYmplY3R8fHt9KVt0XXx8T2JqZWN0W3RdLHI9e307clt0XT1lKGkpLG8oby5TK28uRipzKGZ1bmN0aW9uKCl7aSgxKX0pLCJPYmplY3QiLHIpfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWUuX19lc01vZHVsZT0hMDt2YXIgbj1pKDYzKSxzPW8obikscj1pKDY2KSxhPW8ociksaD0iZnVuY3Rpb24iPT10eXBlb2YgYS5kZWZhdWx0JiYic3ltYm9sIj09dHlwZW9mIHMuZGVmYXVsdD9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5kZWZhdWx0JiZ0LmNvbnN0cnVjdG9yPT09YS5kZWZhdWx0JiZ0IT09YS5kZWZhdWx0LnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH07ZS5kZWZhdWx0PSJmdW5jdGlvbiI9PXR5cGVvZiBhLmRlZmF1bHQmJiJzeW1ib2wiPT09aChzLmRlZmF1bHQpP2Z1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10PyJ1bmRlZmluZWQiOmgodCl9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5kZWZhdWx0JiZ0LmNvbnN0cnVjdG9yPT09YS5kZWZhdWx0JiZ0IT09YS5kZWZhdWx0LnByb3RvdHlwZT8ic3ltYm9sIjp2b2lkIDA9PT10PyJ1bmRlZmluZWQiOmgodCl9fSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoNjQpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSg1MCksaSg0KSx0LmV4cG9ydHM9aSg2NSkuZigiaXRlcmF0b3IiKX0sZnVuY3Rpb24odCxlLGkpe2UuZj1pKDQ3KX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDY3KSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe2koNjgpLGkoNzkpLGkoODApLGkoODEpLHQuZXhwb3J0cz1pKDE3KS5TeW1ib2x9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDE2KSxuPWkoMzEpLHM9aSgyNSkscj1pKDE1KSxhPWkoMzApLGg9aSg2OSkuS0VZLGQ9aSgyNiksbD1pKDQyKSx1PWkoNDYpLGM9aSg0MykscD1pKDQ3KSxmPWkoNjUpLG09aSg3MCksdj1pKDcxKSxnPWkoNzIpLHk9aSg3NSksYj1pKDIyKSxfPWkoOSksdz1pKDI4KSx4PWkoMjkpLGs9aSgzMyksTT1pKDc2KSxTPWkoNzgpLEQ9aSgyMSksTz1pKDM1KSxDPVMuZixUPUQuZixFPU0uZixQPW8uU3ltYm9sLEk9by5KU09OLE49SSYmSS5zdHJpbmdpZnksUj1wKCJfaGlkZGVuIiksQT1wKCJ0b1ByaW1pdGl2ZSIpLHo9e30ucHJvcGVydHlJc0VudW1lcmFibGUsTD1sKCJzeW1ib2wtcmVnaXN0cnkiKSxGPWwoInN5bWJvbHMiKSxCPWwoIm9wLXN5bWJvbHMiKSxqPU9iamVjdC5wcm90b3R5cGUsSD0iZnVuY3Rpb24iPT10eXBlb2YgUCxXPW8uUU9iamVjdCxZPSFXfHwhVy5wcm90b3R5cGV8fCFXLnByb3RvdHlwZS5maW5kQ2hpbGQsRz1zJiZkKGZ1bmN0aW9uKCl7cmV0dXJuIDchPWsoVCh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBUKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxpKXt2YXIgbz1DKGosZSk7byYmZGVsZXRlIGpbZV0sVCh0LGUsaSksbyYmdCE9PWomJlQoaixlLG8pfTpULFY9ZnVuY3Rpb24odCl7dmFyIGU9Rlt0XT1rKFAucHJvdG90eXBlKTtyZXR1cm4gZS5faz10LGV9LFU9SCYmInN5bWJvbCI9PXR5cGVvZiBQLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBQfSxxPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdD09PWomJnEoQixlLGkpLGIodCksZT13KGUsITApLGIoaSksbihGLGUpPyhpLmVudW1lcmFibGU/KG4odCxSKSYmdFtSXVtlXSYmKHRbUl1bZV09ITEpLGk9ayhpLHtlbnVtZXJhYmxlOngoMCwhMSl9KSk6KG4odCxSKXx8VCh0LFIseCgxLHt9KSksdFtSXVtlXT0hMCksRyh0LGUsaSkpOlQodCxlLGkpfSxYPWZ1bmN0aW9uKHQsZSl7Yih0KTtmb3IodmFyIGksbz1nKGU9XyhlKSksbj0wLHM9by5sZW5ndGg7cz5uOylxKHQsaT1vW24rK10sZVtpXSk7cmV0dXJuIHR9LFo9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZT9rKHQpOlgoayh0KSxlKX0sSz1mdW5jdGlvbih0KXt2YXIgZT16LmNhbGwodGhpcyx0PXcodCwhMCkpO3JldHVybiEodGhpcz09PWomJm4oRix0KSYmIW4oQix0KSkmJighKGV8fCFuKHRoaXMsdCl8fCFuKEYsdCl8fG4odGhpcyxSKSYmdGhpc1tSXVt0XSl8fGUpfSxKPWZ1bmN0aW9uKHQsZSl7aWYodD1fKHQpLGU9dyhlLCEwKSx0IT09anx8IW4oRixlKXx8bihCLGUpKXt2YXIgaT1DKHQsZSk7cmV0dXJuIWl8fCFuKEYsZSl8fG4odCxSKSYmdFtSXVtlXXx8KGkuZW51bWVyYWJsZT0hMCksaX19LFE9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9RShfKHQpKSxvPVtdLHM9MDtpLmxlbmd0aD5zOyluKEYsZT1pW3MrK10pfHxlPT1SfHxlPT1ofHxvLnB1c2goZSk7cmV0dXJuIG99LCQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dD09PWosbz1FKGk/QjpfKHQpKSxzPVtdLHI9MDtvLmxlbmd0aD5yOykhbihGLGU9b1tyKytdKXx8aSYmIW4oaixlKXx8cy5wdXNoKEZbZV0pO3JldHVybiBzfTtIfHwoUD1mdW5jdGlvbigpe2lmKHRoaXMgaW5zdGFuY2VvZiBQKXRocm93IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yISIpO3ZhciB0PWMoYXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDApLGU9ZnVuY3Rpb24oaSl7dGhpcz09PWomJmUuY2FsbChCLGkpLG4odGhpcyxSKSYmbih0aGlzW1JdLHQpJiYodGhpc1tSXVt0XT0hMSksRyh0aGlzLHQseCgxLGkpKX07cmV0dXJuIHMmJlkmJkcoaix0LHtjb25maWd1cmFibGU6ITAsc2V0OmV9KSxWKHQpfSxhKFAucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fa30pLFMuZj1KLEQuZj1xLGkoNzcpLmY9TS5mPVEsaSg3NCkuZj1LLGkoNzMpLmY9JCxzJiYhaSgxNCkmJmEoaiwicHJvcGVydHlJc0VudW1lcmFibGUiLEssITApLGYuZj1mdW5jdGlvbih0KXtyZXR1cm4gVihwKHQpKX0pLHIoci5HK3IuVytyLkYqIUgse1N5bWJvbDpQfSk7Zm9yKHZhciB0dD0iaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMiLnNwbGl0KCIsIiksZXQ9MDt0dC5sZW5ndGg+ZXQ7KXAodHRbZXQrK10pO2Zvcih2YXIgdHQ9TyhwLnN0b3JlKSxldD0wO3R0Lmxlbmd0aD5ldDspbSh0dFtldCsrXSk7cihyLlMrci5GKiFILCJTeW1ib2wiLHtmb3I6ZnVuY3Rpb24odCl7cmV0dXJuIG4oTCx0Kz0iIik/TFt0XTpMW3RdPVAodCl9LGtleUZvcjpmdW5jdGlvbih0KXtpZihVKHQpKXJldHVybiB2KEwsdCk7dGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2whIil9LHVzZVNldHRlcjpmdW5jdGlvbigpe1k9ITB9LHVzZVNpbXBsZTpmdW5jdGlvbigpe1k9ITF9fSkscihyLlMrci5GKiFILCJPYmplY3QiLHtjcmVhdGU6WixkZWZpbmVQcm9wZXJ0eTpxLGRlZmluZVByb3BlcnRpZXM6WCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6SixnZXRPd25Qcm9wZXJ0eU5hbWVzOlEsZ2V0T3duUHJvcGVydHlTeW1ib2xzOiR9KSxJJiZyKHIuUytyLkYqKCFIfHxkKGZ1bmN0aW9uKCl7dmFyIHQ9UCgpO3JldHVybiJbbnVsbF0iIT1OKFt0XSl8fCJ7fSIhPU4oe2E6dH0pfHwie30iIT1OKE9iamVjdCh0KSl9KSksIkpTT04iLHtzdHJpbmdpZnk6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCYmIVUodCkpe2Zvcih2YXIgZSxpLG89W3RdLG49MTthcmd1bWVudHMubGVuZ3RoPm47KW8ucHVzaChhcmd1bWVudHNbbisrXSk7cmV0dXJuIGU9b1sxXSwiZnVuY3Rpb24iPT10eXBlb2YgZSYmKGk9ZSksIWkmJnkoZSl8fChlPWZ1bmN0aW9uKHQsZSl7aWYoaSYmKGU9aS5jYWxsKHRoaXMsdCxlKSksIVUoZSkpcmV0dXJuIGV9KSxvWzFdPWUsTi5hcHBseShJLG8pfX19KSxQLnByb3RvdHlwZVtBXXx8aSgyMCkoUC5wcm90b3R5cGUsQSxQLnByb3RvdHlwZS52YWx1ZU9mKSx1KFAsIlN5bWJvbCIpLHUoTWF0aCwiTWF0aCIsITApLHUoby5KU09OLCJKU09OIiwhMCl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDQzKSgibWV0YSIpLG49aSgyMykscz1pKDMxKSxyPWkoMjEpLmYsYT0wLGg9T2JqZWN0LmlzRXh0ZW5zaWJsZXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZD0haSgyNikoZnVuY3Rpb24oKXtyZXR1cm4gaChPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pLGw9ZnVuY3Rpb24odCl7cih0LG8se3ZhbHVlOntpOiJPIisgKythLHc6e319fSl9LHU9ZnVuY3Rpb24odCxlKXtpZighbih0KSlyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHQ/dDooInN0cmluZyI9PXR5cGVvZiB0PyJTIjoiUCIpK3Q7aWYoIXModCxvKSl7aWYoIWgodCkpcmV0dXJuIkYiO2lmKCFlKXJldHVybiJFIjtsKHQpfXJldHVybiB0W29dLml9LGM9ZnVuY3Rpb24odCxlKXtpZighcyh0LG8pKXtpZighaCh0KSlyZXR1cm4hMDtpZighZSlyZXR1cm4hMTtsKHQpfXJldHVybiB0W29dLnd9LHA9ZnVuY3Rpb24odCl7cmV0dXJuIGQmJmYuTkVFRCYmaCh0KSYmIXModCxvKSYmbCh0KSx0fSxmPXQuZXhwb3J0cz17S0VZOm8sTkVFRDohMSxmYXN0S2V5OnUsZ2V0V2VhazpjLG9uRnJlZXplOnB9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgxNiksbj1pKDE3KSxzPWkoMTQpLHI9aSg2NSksYT1pKDIxKS5mO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1uLlN5bWJvbHx8KG4uU3ltYm9sPXM/e306by5TeW1ib2x8fHt9KTsiXyI9PXQuY2hhckF0KDApfHx0IGluIGV8fGEoZSx0LHt2YWx1ZTpyLmYodCl9KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDM1KSxuPWkoOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpLHM9bih0KSxyPW8ocyksYT1yLmxlbmd0aCxoPTA7YT5oOylpZihzW2k9cltoKytdXT09PWUpcmV0dXJuIGl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgzNSksbj1pKDczKSxzPWkoNzQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1vKHQpLGk9bi5mO2lmKGkpZm9yKHZhciByLGE9aSh0KSxoPXMuZixkPTA7YS5sZW5ndGg+ZDspaC5jYWxsKHQscj1hW2QrK10pJiZlLnB1c2gocik7cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUpe2UuZj17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTEpO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iQXJyYXkiPT1vKHQpfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoOSksbj1pKDc3KS5mLHM9e30udG9TdHJpbmcscj0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93JiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcz9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpOltdLGE9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBuKHQpfWNhdGNoKHQpe3JldHVybiByLnNsaWNlKCl9fTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gciYmIltvYmplY3QgV2luZG93XSI9PXMuY2FsbCh0KT9hKHQpOm4obyh0KSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgzNiksbj1pKDQ0KS5jb25jYXQoImxlbmd0aCIsInByb3RvdHlwZSIpO2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24odCl7cmV0dXJuIG8odCxuKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDc0KSxuPWkoMjkpLHM9aSg5KSxyPWkoMjgpLGE9aSgzMSksaD1pKDI0KSxkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7ZS5mPWkoMjUpP2Q6ZnVuY3Rpb24odCxlKXtpZih0PXModCksZT1yKGUsITApLGgpdHJ5e3JldHVybiBkKHQsZSl9Y2F0Y2godCl7fWlmKGEodCxlKSlyZXR1cm4gbighby5mLmNhbGwodCxlKSx0W2VdKX19LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUsaSl7aSg3MCkoImFzeW5jSXRlcmF0b3IiKX0sZnVuY3Rpb24odCxlLGkpe2koNzApKCJvYnNlcnZhYmxlIil9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5tb21lbnR8fGkoODMpfSxmdW5jdGlvbih0LGUsaSl7KGZ1bmN0aW9uKHQpeyFmdW5jdGlvbihlLGkpe3QuZXhwb3J0cz1pKCl9KDAsZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7cmV0dXJuIGJvLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBpKHQpe3JldHVybiB0IGluc3RhbmNlb2YgQXJyYXl8fCJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbnVsbCE9dCYmIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbih0KXt2YXIgZTtmb3IoZSBpbiB0KXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHModCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24gcih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fCJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlfHwiW29iamVjdCBEYXRlXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gaCh0LGUpe3ZhciBpLG89W107Zm9yKGk9MDtpPHQubGVuZ3RoOysraSlvLnB1c2goZSh0W2ldLGkpKTtyZXR1cm4gb31mdW5jdGlvbiBkKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIGwodCxlKXtmb3IodmFyIGkgaW4gZSlkKGUsaSkmJih0W2ldPWVbaV0pO3JldHVybiBkKGUsInRvU3RyaW5nIikmJih0LnRvU3RyaW5nPWUudG9TdHJpbmcpLGQoZSwidmFsdWVPZiIpJiYodC52YWx1ZU9mPWUudmFsdWVPZiksdH1mdW5jdGlvbiB1KHQsZSxpLG8pe3JldHVybiB5ZSh0LGUsaSxvLCEwKS51dGMoKX1mdW5jdGlvbiBjKCl7cmV0dXJue2VtcHR5OiExLHVudXNlZFRva2VuczpbXSx1bnVzZWRJbnB1dDpbXSxvdmVyZmxvdzotMixjaGFyc0xlZnRPdmVyOjAsbnVsbElucHV0OiExLGludmFsaWRNb250aDpudWxsLGludmFsaWRGb3JtYXQ6ITEsdXNlckludmFsaWRhdGVkOiExLGlzbzohMSxwYXJzZWREYXRlUGFydHM6W10sbWVyaWRpZW06bnVsbCxyZmMyODIyOiExLHdlZWtkYXlNaXNtYXRjaDohMX19ZnVuY3Rpb24gcCh0KXtyZXR1cm4gbnVsbD09dC5fcGYmJih0Ll9wZj1jKCkpLHQuX3BmfWZ1bmN0aW9uIGYodCl7aWYobnVsbD09dC5faXNWYWxpZCl7dmFyIGU9cCh0KSxpPXdvLmNhbGwoZS5wYXJzZWREYXRlUGFydHMsZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXR9KSxvPSFpc05hTih0Ll9kLmdldFRpbWUoKSkmJmUub3ZlcmZsb3c8MCYmIWUuZW1wdHkmJiFlLmludmFsaWRNb250aCYmIWUuaW52YWxpZFdlZWtkYXkmJiFlLm51bGxJbnB1dCYmIWUuaW52YWxpZEZvcm1hdCYmIWUudXNlckludmFsaWRhdGVkJiYoIWUubWVyaWRpZW18fGUubWVyaWRpZW0mJmkpO2lmKHQuX3N0cmljdCYmKG89byYmMD09PWUuY2hhcnNMZWZ0T3ZlciYmMD09PWUudW51c2VkVG9rZW5zLmxlbmd0aCYmdm9pZCAwPT09ZS5iaWdIb3VyKSxudWxsIT1PYmplY3QuaXNGcm96ZW4mJk9iamVjdC5pc0Zyb3plbih0KSlyZXR1cm4gbzt0Ll9pc1ZhbGlkPW99cmV0dXJuIHQuX2lzVmFsaWR9ZnVuY3Rpb24gbSh0KXt2YXIgZT11KE5hTik7cmV0dXJuIG51bGwhPXQ/bChwKGUpLHQpOnAoZSkudXNlckludmFsaWRhdGVkPSEwLGV9ZnVuY3Rpb24gdih0LGUpe3ZhciBpLG8sbjtpZihzKGUuX2lzQU1vbWVudE9iamVjdCl8fCh0Ll9pc0FNb21lbnRPYmplY3Q9ZS5faXNBTW9tZW50T2JqZWN0KSxzKGUuX2kpfHwodC5faT1lLl9pKSxzKGUuX2YpfHwodC5fZj1lLl9mKSxzKGUuX2wpfHwodC5fbD1lLl9sKSxzKGUuX3N0cmljdCl8fCh0Ll9zdHJpY3Q9ZS5fc3RyaWN0KSwKcyhlLl90em0pfHwodC5fdHptPWUuX3R6bSkscyhlLl9pc1VUQyl8fCh0Ll9pc1VUQz1lLl9pc1VUQykscyhlLl9vZmZzZXQpfHwodC5fb2Zmc2V0PWUuX29mZnNldCkscyhlLl9wZil8fCh0Ll9wZj1wKGUpKSxzKGUuX2xvY2FsZSl8fCh0Ll9sb2NhbGU9ZS5fbG9jYWxlKSx4by5sZW5ndGg+MClmb3IoaT0wO2k8eG8ubGVuZ3RoO2krKylvPXhvW2ldLG49ZVtvXSxzKG4pfHwodFtvXT1uKTtyZXR1cm4gdH1mdW5jdGlvbiBnKHQpe3YodGhpcyx0KSx0aGlzLl9kPW5ldyBEYXRlKG51bGwhPXQuX2Q/dC5fZC5nZXRUaW1lKCk6TmFOKSx0aGlzLmlzVmFsaWQoKXx8KHRoaXMuX2Q9bmV3IERhdGUoTmFOKSksITE9PT1rbyYmKGtvPSEwLGUudXBkYXRlT2Zmc2V0KHRoaXMpLGtvPSExKX1mdW5jdGlvbiB5KHQpe3JldHVybiB0IGluc3RhbmNlb2YgZ3x8bnVsbCE9dCYmbnVsbCE9dC5faXNBTW9tZW50T2JqZWN0fWZ1bmN0aW9uIGIodCl7cmV0dXJuIHQ8MD9NYXRoLmNlaWwodCl8fDA6TWF0aC5mbG9vcih0KX1mdW5jdGlvbiBfKHQpe3ZhciBlPSt0LGk9MDtyZXR1cm4gMCE9PWUmJmlzRmluaXRlKGUpJiYoaT1iKGUpKSxpfWZ1bmN0aW9uIHcodCxlLGkpe3ZhciBvLG49TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpLHM9TWF0aC5hYnModC5sZW5ndGgtZS5sZW5ndGgpLHI9MDtmb3Iobz0wO288bjtvKyspKGkmJnRbb10hPT1lW29dfHwhaSYmXyh0W29dKSE9PV8oZVtvXSkpJiZyKys7cmV0dXJuIHIrc31mdW5jdGlvbiB4KHQpeyExPT09ZS5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MmJiJ1bmRlZmluZWQiIT10eXBlb2YgY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oIkRlcHJlY2F0aW9uIHdhcm5pbmc6ICIrdCl9ZnVuY3Rpb24gayh0LGkpe3ZhciBvPSEwO3JldHVybiBsKGZ1bmN0aW9uKCl7aWYobnVsbCE9ZS5kZXByZWNhdGlvbkhhbmRsZXImJmUuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsdCksbyl7Zm9yKHZhciBuLHM9W10scj0wO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspe2lmKG49IiIsIm9iamVjdCI9PXR5cGVvZiBhcmd1bWVudHNbcl0pe24rPSJcblsiK3IrIl0gIjtmb3IodmFyIGEgaW4gYXJndW1lbnRzWzBdKW4rPWErIjogIithcmd1bWVudHNbMF1bYV0rIiwgIjtuPW4uc2xpY2UoMCwtMil9ZWxzZSBuPWFyZ3VtZW50c1tyXTtzLnB1c2gobil9eCh0KyJcbkFyZ3VtZW50czogIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzKS5qb2luKCIiKSsiXG4iKyhuZXcgRXJyb3IpLnN0YWNrKSxvPSExfXJldHVybiBpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saSl9ZnVuY3Rpb24gTSh0LGkpe251bGwhPWUuZGVwcmVjYXRpb25IYW5kbGVyJiZlLmRlcHJlY2F0aW9uSGFuZGxlcih0LGkpLE1vW3RdfHwoeChpKSxNb1t0XT0hMCl9ZnVuY3Rpb24gUyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEZ1bmN0aW9ufHwiW29iamVjdCBGdW5jdGlvbl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIEQodCl7dmFyIGUsaTtmb3IoaSBpbiB0KWU9dFtpXSxTKGUpP3RoaXNbaV09ZTp0aGlzWyJfIitpXT1lO3RoaXMuX2NvbmZpZz10LHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50PW5ldyBSZWdFeHAoKHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2Uuc291cmNlfHx0aGlzLl9vcmRpbmFsUGFyc2Uuc291cmNlKSsifCIrL1xkezEsMn0vLnNvdXJjZSl9ZnVuY3Rpb24gTyh0LGUpe3ZhciBpLG49bCh7fSx0KTtmb3IoaSBpbiBlKWQoZSxpKSYmKG8odFtpXSkmJm8oZVtpXSk/KG5baV09e30sbChuW2ldLHRbaV0pLGwobltpXSxlW2ldKSk6bnVsbCE9ZVtpXT9uW2ldPWVbaV06ZGVsZXRlIG5baV0pO2ZvcihpIGluIHQpZCh0LGkpJiYhZChlLGkpJiZvKHRbaV0pJiYobltpXT1sKHt9LG5baV0pKTtyZXR1cm4gbn1mdW5jdGlvbiBDKHQpe251bGwhPXQmJnRoaXMuc2V0KHQpfWZ1bmN0aW9uIFQodCxlLGkpe3ZhciBvPXRoaXMuX2NhbGVuZGFyW3RdfHx0aGlzLl9jYWxlbmRhci5zYW1lRWxzZTtyZXR1cm4gUyhvKT9vLmNhbGwoZSxpKTpvfWZ1bmN0aW9uIEUodCl7dmFyIGU9dGhpcy5fbG9uZ0RhdGVGb3JtYXRbdF0saT10aGlzLl9sb25nRGF0ZUZvcm1hdFt0LnRvVXBwZXJDYXNlKCldO3JldHVybiBlfHwhaT9lOih0aGlzLl9sb25nRGF0ZUZvcm1hdFt0XT1pLnJlcGxhY2UoL01NTU18TU18RER8ZGRkZC9nLGZ1bmN0aW9uKHQpe3JldHVybiB0LnNsaWNlKDEpfSksdGhpcy5fbG9uZ0RhdGVGb3JtYXRbdF0pfWZ1bmN0aW9uIFAoKXtyZXR1cm4gdGhpcy5faW52YWxpZERhdGV9ZnVuY3Rpb24gSSh0KXtyZXR1cm4gdGhpcy5fb3JkaW5hbC5yZXBsYWNlKCIlZCIsdCl9ZnVuY3Rpb24gTih0LGUsaSxvKXt2YXIgbj10aGlzLl9yZWxhdGl2ZVRpbWVbaV07cmV0dXJuIFMobik/bih0LGUsaSxvKTpuLnJlcGxhY2UoLyVkL2ksdCl9ZnVuY3Rpb24gUih0LGUpe3ZhciBpPXRoaXMuX3JlbGF0aXZlVGltZVt0PjA/ImZ1dHVyZSI6InBhc3QiXTtyZXR1cm4gUyhpKT9pKGUpOmkucmVwbGFjZSgvJXMvaSxlKX1mdW5jdGlvbiBBKHQsZSl7dmFyIGk9dC50b0xvd2VyQ2FzZSgpO0lvW2ldPUlvW2krInMiXT1Jb1tlXT10fWZ1bmN0aW9uIHoodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0lvW3RdfHxJb1t0LnRvTG93ZXJDYXNlKCldOnZvaWQgMH1mdW5jdGlvbiBMKHQpe3ZhciBlLGksbz17fTtmb3IoaSBpbiB0KWQodCxpKSYmKGU9eihpKSkmJihvW2VdPXRbaV0pO3JldHVybiBvfWZ1bmN0aW9uIEYodCxlKXtOb1t0XT1lfWZ1bmN0aW9uIEIodCl7dmFyIGU9W107Zm9yKHZhciBpIGluIHQpZS5wdXNoKHt1bml0OmkscHJpb3JpdHk6Tm9baV19KTtyZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucHJpb3JpdHktZS5wcmlvcml0eX0pLGV9ZnVuY3Rpb24gaih0LGkpe3JldHVybiBmdW5jdGlvbihvKXtyZXR1cm4gbnVsbCE9bz8oVyh0aGlzLHQsbyksZS51cGRhdGVPZmZzZXQodGhpcyxpKSx0aGlzKTpIKHRoaXMsdCl9fWZ1bmN0aW9uIEgodCxlKXtyZXR1cm4gdC5pc1ZhbGlkKCk/dC5fZFsiZ2V0IisodC5faXNVVEM/IlVUQyI6IiIpK2VdKCk6TmFOfWZ1bmN0aW9uIFcodCxlLGkpe3QuaXNWYWxpZCgpJiZ0Ll9kWyJzZXQiKyh0Ll9pc1VUQz8iVVRDIjoiIikrZV0oaSl9ZnVuY3Rpb24gWSh0KXtyZXR1cm4gdD16KHQpLFModGhpc1t0XSk/dGhpc1t0XSgpOnRoaXN9ZnVuY3Rpb24gRyh0LGUpe2lmKCJvYmplY3QiPT10eXBlb2YgdCl7dD1MKHQpO2Zvcih2YXIgaT1CKHQpLG89MDtvPGkubGVuZ3RoO28rKyl0aGlzW2lbb10udW5pdF0odFtpW29dLnVuaXRdKX1lbHNlIGlmKHQ9eih0KSxTKHRoaXNbdF0pKXJldHVybiB0aGlzW3RdKGUpO3JldHVybiB0aGlzfWZ1bmN0aW9uIFYodCxlLGkpe3ZhciBvPSIiK01hdGguYWJzKHQpLG49ZS1vLmxlbmd0aDtyZXR1cm4odD49MD9pPyIrIjoiIjoiLSIpK01hdGgucG93KDEwLE1hdGgubWF4KDAsbikpLnRvU3RyaW5nKCkuc3Vic3RyKDEpK299ZnVuY3Rpb24gVSh0LGUsaSxvKXt2YXIgbj1vOyJzdHJpbmciPT10eXBlb2YgbyYmKG49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tvXSgpfSksdCYmKExvW3RdPW4pLGUmJihMb1tlWzBdXT1mdW5jdGlvbigpe3JldHVybiBWKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGVbMV0sZVsyXSl9KSxpJiYoTG9baV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkub3JkaW5hbChuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0KX0pfWZ1bmN0aW9uIHEodCl7cmV0dXJuIHQubWF0Y2goL1xbW1xzXFNdLyk/dC5yZXBsYWNlKC9eXFt8XF0kL2csIiIpOnQucmVwbGFjZSgvXFwvZywiIil9ZnVuY3Rpb24gWCh0KXt2YXIgZSxpLG89dC5tYXRjaChSbyk7Zm9yKGU9MCxpPW8ubGVuZ3RoO2U8aTtlKyspTG9bb1tlXV0/b1tlXT1Mb1tvW2VdXTpvW2VdPXEob1tlXSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuLHM9IiI7Zm9yKG49MDtuPGk7bisrKXMrPVMob1tuXSk/b1tuXS5jYWxsKGUsdCk6b1tuXTtyZXR1cm4gc319ZnVuY3Rpb24gWih0LGUpe3JldHVybiB0LmlzVmFsaWQoKT8oZT1LKGUsdC5sb2NhbGVEYXRhKCkpLHpvW2VdPXpvW2VdfHxYKGUpLHpvW2VdKHQpKTp0LmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpfWZ1bmN0aW9uIEsodCxlKXtmdW5jdGlvbiBpKHQpe3JldHVybiBlLmxvbmdEYXRlRm9ybWF0KHQpfHx0fXZhciBvPTU7Zm9yKEFvLmxhc3RJbmRleD0wO28+PTAmJkFvLnRlc3QodCk7KXQ9dC5yZXBsYWNlKEFvLGkpLEFvLmxhc3RJbmRleD0wLG8tPTE7cmV0dXJuIHR9ZnVuY3Rpb24gSih0LGUsaSl7ZW5bdF09UyhlKT9lOmZ1bmN0aW9uKHQsbyl7cmV0dXJuIHQmJmk/aTplfX1mdW5jdGlvbiBRKHQsZSl7cmV0dXJuIGQoZW4sdCk/ZW5bdF0oZS5fc3RyaWN0LGUuX2xvY2FsZSk6bmV3IFJlZ0V4cCgkKHQpKX1mdW5jdGlvbiAkKHQpe3JldHVybiB0dCh0LnJlcGxhY2UoIlxcIiwiIikucmVwbGFjZSgvXFwoXFspfFxcKFxdKXxcWyhbXlxdXFtdKilcXXxcXCguKS9nLGZ1bmN0aW9uKHQsZSxpLG8sbil7cmV0dXJuIGV8fGl8fG98fG59KSl9ZnVuY3Rpb24gdHQodCl7cmV0dXJuIHQucmVwbGFjZSgvWy1cL1xcXiQqKz8uKCl8W1xde31dL2csIlxcJCYiKX1mdW5jdGlvbiBldCh0LGUpe3ZhciBpLG89ZTtmb3IoInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHIoZSkmJihvPWZ1bmN0aW9uKHQsaSl7aVtlXT1fKHQpfSksaT0wO2k8dC5sZW5ndGg7aSsrKW9uW3RbaV1dPW99ZnVuY3Rpb24gaXQodCxlKXtldCh0LGZ1bmN0aW9uKHQsaSxvLG4pe28uX3c9by5fd3x8e30sZSh0LG8uX3csbyxuKX0pfWZ1bmN0aW9uIG90KHQsZSxpKXtudWxsIT1lJiZkKG9uLHQpJiZvblt0XShlLGkuX2EsaSx0KX1mdW5jdGlvbiBudCh0LGUpe3JldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh0LGUrMSwwKSkuZ2V0VVRDRGF0ZSgpfWZ1bmN0aW9uIHN0KHQsZSl7cmV0dXJuIHQ/aSh0aGlzLl9tb250aHMpP3RoaXMuX21vbnRoc1t0Lm1vbnRoKCldOnRoaXMuX21vbnRoc1sodGhpcy5fbW9udGhzLmlzRm9ybWF0fHxmbikudGVzdChlKT8iZm9ybWF0Ijoic3RhbmRhbG9uZSJdW3QubW9udGgoKV06aSh0aGlzLl9tb250aHMpP3RoaXMuX21vbnRoczp0aGlzLl9tb250aHMuc3RhbmRhbG9uZX1mdW5jdGlvbiBydCh0LGUpe3JldHVybiB0P2kodGhpcy5fbW9udGhzU2hvcnQpP3RoaXMuX21vbnRoc1Nob3J0W3QubW9udGgoKV06dGhpcy5fbW9udGhzU2hvcnRbZm4udGVzdChlKT8iZm9ybWF0Ijoic3RhbmRhbG9uZSJdW3QubW9udGgoKV06aSh0aGlzLl9tb250aHNTaG9ydCk/dGhpcy5fbW9udGhzU2hvcnQ6dGhpcy5fbW9udGhzU2hvcnQuc3RhbmRhbG9uZX1mdW5jdGlvbiBhdCh0LGUsaSl7dmFyIG8sbixzLHI9dC50b0xvY2FsZUxvd2VyQ2FzZSgpO2lmKCF0aGlzLl9tb250aHNQYXJzZSlmb3IodGhpcy5fbW9udGhzUGFyc2U9W10sdGhpcy5fbG9uZ01vbnRoc1BhcnNlPVtdLHRoaXMuX3Nob3J0TW9udGhzUGFyc2U9W10sbz0wO288MTI7KytvKXM9dShbMmUzLG9dKSx0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW29dPXRoaXMubW9udGhzU2hvcnQocywiIikudG9Mb2NhbGVMb3dlckNhc2UoKSx0aGlzLl9sb25nTW9udGhzUGFyc2Vbb109dGhpcy5tb250aHMocywiIikudG9Mb2NhbGVMb3dlckNhc2UoKTtyZXR1cm4gaT8iTU1NIj09PWU/KG49cG4uY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLHIpLC0xIT09bj9uOm51bGwpOihuPXBuLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLHIpLC0xIT09bj9uOm51bGwpOiJNTU0iPT09ZT8tMSE9PShuPXBuLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxyKSk/bjoobj1wbi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKTotMSE9PShuPXBuLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLHIpKT9uOihuPXBuLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKX1mdW5jdGlvbiBodCh0LGUsaSl7dmFyIG8sbixzO2lmKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpcmV0dXJuIGF0LmNhbGwodGhpcyx0LGUsaSk7Zm9yKHRoaXMuX21vbnRoc1BhcnNlfHwodGhpcy5fbW9udGhzUGFyc2U9W10sdGhpcy5fbG9uZ01vbnRoc1BhcnNlPVtdLHRoaXMuX3Nob3J0TW9udGhzUGFyc2U9W10pLG89MDtvPDEyO28rKyl7aWYobj11KFsyZTMsb10pLGkmJiF0aGlzLl9sb25nTW9udGhzUGFyc2Vbb10mJih0aGlzLl9sb25nTW9udGhzUGFyc2Vbb109bmV3IFJlZ0V4cCgiXiIrdGhpcy5tb250aHMobiwiIikucmVwbGFjZSgiLiIsIiIpKyIkIiwiaSIpLHRoaXMuX3Nob3J0TW9udGhzUGFyc2Vbb109bmV3IFJlZ0V4cCgiXiIrdGhpcy5tb250aHNTaG9ydChuLCIiKS5yZXBsYWNlKCIuIiwiIikrIiQiLCJpIikpLGl8fHRoaXMuX21vbnRoc1BhcnNlW29dfHwocz0iXiIrdGhpcy5tb250aHMobiwiIikrInxeIit0aGlzLm1vbnRoc1Nob3J0KG4sIiIpLHRoaXMuX21vbnRoc1BhcnNlW29dPW5ldyBSZWdFeHAocy5yZXBsYWNlKCIuIiwiIiksImkiKSksaSYmIk1NTU0iPT09ZSYmdGhpcy5fbG9uZ01vbnRoc1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG87aWYoaSYmIk1NTSI9PT1lJiZ0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG87aWYoIWkmJnRoaXMuX21vbnRoc1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG99fWZ1bmN0aW9uIGR0KHQsZSl7dmFyIGk7aWYoIXQuaXNWYWxpZCgpKXJldHVybiB0O2lmKCJzdHJpbmciPT10eXBlb2YgZSlpZigvXlxkKyQvLnRlc3QoZSkpZT1fKGUpO2Vsc2UgaWYoZT10LmxvY2FsZURhdGEoKS5tb250aHNQYXJzZShlKSwhcihlKSlyZXR1cm4gdDtyZXR1cm4gaT1NYXRoLm1pbih0LmRhdGUoKSxudCh0LnllYXIoKSxlKSksdC5fZFsic2V0IisodC5faXNVVEM/IlVUQyI6IiIpKyJNb250aCJdKGUsaSksdH1mdW5jdGlvbiBsdCh0KXtyZXR1cm4gbnVsbCE9dD8oZHQodGhpcyx0KSxlLnVwZGF0ZU9mZnNldCh0aGlzLCEwKSx0aGlzKTpIKHRoaXMsIk1vbnRoIil9ZnVuY3Rpb24gdXQoKXtyZXR1cm4gbnQodGhpcy55ZWFyKCksdGhpcy5tb250aCgpKX1mdW5jdGlvbiBjdCh0KXtyZXR1cm4gdGhpcy5fbW9udGhzUGFyc2VFeGFjdD8oZCh0aGlzLCJfbW9udGhzUmVnZXgiKXx8ZnQuY2FsbCh0aGlzKSx0P3RoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg6dGhpcy5fbW9udGhzU2hvcnRSZWdleCk6KGQodGhpcywiX21vbnRoc1Nob3J0UmVnZXgiKXx8KHRoaXMuX21vbnRoc1Nob3J0UmVnZXg9Z24pLHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXgmJnQ/dGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl9tb250aHNTaG9ydFJlZ2V4KX1mdW5jdGlvbiBwdCh0KXtyZXR1cm4gdGhpcy5fbW9udGhzUGFyc2VFeGFjdD8oZCh0aGlzLCJfbW9udGhzUmVnZXgiKXx8ZnQuY2FsbCh0aGlzKSx0P3RoaXMuX21vbnRoc1N0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1JlZ2V4KTooZCh0aGlzLCJfbW9udGhzUmVnZXgiKXx8KHRoaXMuX21vbnRoc1JlZ2V4PXluKSx0aGlzLl9tb250aHNTdHJpY3RSZWdleCYmdD90aGlzLl9tb250aHNTdHJpY3RSZWdleDp0aGlzLl9tb250aHNSZWdleCl9ZnVuY3Rpb24gZnQoKXtmdW5jdGlvbiB0KHQsZSl7cmV0dXJuIGUubGVuZ3RoLXQubGVuZ3RofXZhciBlLGksbz1bXSxuPVtdLHM9W107Zm9yKGU9MDtlPDEyO2UrKylpPXUoWzJlMyxlXSksby5wdXNoKHRoaXMubW9udGhzU2hvcnQoaSwiIikpLG4ucHVzaCh0aGlzLm1vbnRocyhpLCIiKSkscy5wdXNoKHRoaXMubW9udGhzKGksIiIpKSxzLnB1c2godGhpcy5tb250aHNTaG9ydChpLCIiKSk7Zm9yKG8uc29ydCh0KSxuLnNvcnQodCkscy5zb3J0KHQpLGU9MDtlPDEyO2UrKylvW2VdPXR0KG9bZV0pLG5bZV09dHQobltlXSk7Zm9yKGU9MDtlPDI0O2UrKylzW2VdPXR0KHNbZV0pO3RoaXMuX21vbnRoc1JlZ2V4PW5ldyBSZWdFeHAoIl4oIitzLmpvaW4oInwiKSsiKSIsImkiKSx0aGlzLl9tb250aHNTaG9ydFJlZ2V4PXRoaXMuX21vbnRoc1JlZ2V4LHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4PW5ldyBSZWdFeHAoIl4oIituLmpvaW4oInwiKSsiKSIsImkiKSx0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4PW5ldyBSZWdFeHAoIl4oIitvLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBtdCh0KXtyZXR1cm4gdnQodCk/MzY2OjM2NX1mdW5jdGlvbiB2dCh0KXtyZXR1cm4gdCU0PT0wJiZ0JTEwMCE9MHx8dCU0MDA9PTB9ZnVuY3Rpb24gZ3QoKXtyZXR1cm4gdnQodGhpcy55ZWFyKCkpfWZ1bmN0aW9uIHl0KHQsZSxpLG8sbixzLHIpe3ZhciBhPW5ldyBEYXRlKHQsZSxpLG8sbixzLHIpO3JldHVybiB0PDEwMCYmdD49MCYmaXNGaW5pdGUoYS5nZXRGdWxsWWVhcigpKSYmYS5zZXRGdWxsWWVhcih0KSxhfWZ1bmN0aW9uIGJ0KHQpe3ZhciBlPW5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsYXJndW1lbnRzKSk7cmV0dXJuIHQ8MTAwJiZ0Pj0wJiZpc0Zpbml0ZShlLmdldFVUQ0Z1bGxZZWFyKCkpJiZlLnNldFVUQ0Z1bGxZZWFyKHQpLGV9ZnVuY3Rpb24gX3QodCxlLGkpe3ZhciBvPTcrZS1pO3JldHVybi0oNytidCh0LDAsbykuZ2V0VVRDRGF5KCktZSklNytvLTF9ZnVuY3Rpb24gd3QodCxlLGksbyxuKXt2YXIgcyxyLGE9KDcraS1vKSU3LGg9X3QodCxvLG4pLGQ9MSs3KihlLTEpK2EraDtyZXR1cm4gZDw9MD8ocz10LTEscj1tdChzKStkKTpkPm10KHQpPyhzPXQrMSxyPWQtbXQodCkpOihzPXQscj1kKSx7eWVhcjpzLGRheU9mWWVhcjpyfX1mdW5jdGlvbiB4dCh0LGUsaSl7dmFyIG8sbixzPV90KHQueWVhcigpLGUsaSkscj1NYXRoLmZsb29yKCh0LmRheU9mWWVhcigpLXMtMSkvNykrMTtyZXR1cm4gcjwxPyhuPXQueWVhcigpLTEsbz1yK2t0KG4sZSxpKSk6cj5rdCh0LnllYXIoKSxlLGkpPyhvPXIta3QodC55ZWFyKCksZSxpKSxuPXQueWVhcigpKzEpOihuPXQueWVhcigpLG89cikse3dlZWs6byx5ZWFyOm59fWZ1bmN0aW9uIGt0KHQsZSxpKXt2YXIgbz1fdCh0LGUsaSksbj1fdCh0KzEsZSxpKTtyZXR1cm4obXQodCktbytuKS83fWZ1bmN0aW9uIE10KHQpe3JldHVybiB4dCh0LHRoaXMuX3dlZWsuZG93LHRoaXMuX3dlZWsuZG95KS53ZWVrfWZ1bmN0aW9uIFN0KCl7cmV0dXJuIHRoaXMuX3dlZWsuZG93fWZ1bmN0aW9uIER0KCl7cmV0dXJuIHRoaXMuX3dlZWsuZG95fWZ1bmN0aW9uIE90KHQpe3ZhciBlPXRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7cmV0dXJuIG51bGw9PXQ/ZTp0aGlzLmFkZCg3Kih0LWUpLCJkIil9ZnVuY3Rpb24gQ3QodCl7dmFyIGU9eHQodGhpcywxLDQpLndlZWs7cmV0dXJuIG51bGw9PXQ/ZTp0aGlzLmFkZCg3Kih0LWUpLCJkIil9ZnVuY3Rpb24gVHQodCxlKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQ/dDppc05hTih0KT8odD1lLndlZWtkYXlzUGFyc2UodCksIm51bWJlciI9PXR5cGVvZiB0P3Q6bnVsbCk6cGFyc2VJbnQodCwxMCl9ZnVuY3Rpb24gRXQodCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/ZS53ZWVrZGF5c1BhcnNlKHQpJTd8fDc6aXNOYU4odCk/bnVsbDp0fWZ1bmN0aW9uIFB0KHQsZSl7cmV0dXJuIHQ/aSh0aGlzLl93ZWVrZGF5cyk/dGhpcy5fd2Vla2RheXNbdC5kYXkoKV06dGhpcy5fd2Vla2RheXNbdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChlKT8iZm9ybWF0Ijoic3RhbmRhbG9uZSJdW3QuZGF5KCldOmkodGhpcy5fd2Vla2RheXMpP3RoaXMuX3dlZWtkYXlzOnRoaXMuX3dlZWtkYXlzLnN0YW5kYWxvbmV9ZnVuY3Rpb24gSXQodCl7cmV0dXJuIHQ/dGhpcy5fd2Vla2RheXNTaG9ydFt0LmRheSgpXTp0aGlzLl93ZWVrZGF5c1Nob3J0fWZ1bmN0aW9uIE50KHQpe3JldHVybiB0P3RoaXMuX3dlZWtkYXlzTWluW3QuZGF5KCldOnRoaXMuX3dlZWtkYXlzTWlufWZ1bmN0aW9uIFJ0KHQsZSxpKXt2YXIgbyxuLHMscj10LnRvTG9jYWxlTG93ZXJDYXNlKCk7aWYoIXRoaXMuX3dlZWtkYXlzUGFyc2UpZm9yKHRoaXMuX3dlZWtkYXlzUGFyc2U9W10sdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlPVtdLHRoaXMuX21pbldlZWtkYXlzUGFyc2U9W10sbz0wO288NzsrK28pcz11KFsyZTMsMV0pLmRheShvKSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlW29dPXRoaXMud2Vla2RheXNNaW4ocywiIikudG9Mb2NhbGVMb3dlckNhc2UoKSx0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2Vbb109dGhpcy53ZWVrZGF5c1Nob3J0KHMsIiIpLnRvTG9jYWxlTG93ZXJDYXNlKCksdGhpcy5fd2Vla2RheXNQYXJzZVtvXT10aGlzLndlZWtkYXlzKHMsIiIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7cmV0dXJuIGk/ImRkZGQiPT09ZT8obj1wbi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsciksLTEhPT1uP246bnVsbCk6ImRkZCI9PT1lPyhuPXBuLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLHIpLC0xIT09bj9uOm51bGwpOihuPXBuLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKToiZGRkZCI9PT1lPy0xIT09KG49cG4uY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLHIpKT9uOi0xIT09KG49cG4uY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UscikpP246KG49cG4uY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLHIpLC0xIT09bj9uOm51bGwpOiJkZGQiPT09ZT8tMSE9PShuPXBuLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLHIpKT9uOi0xIT09KG49cG4uY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLHIpKT9uOihuPXBuLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKTotMSE9PShuPXBuLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSxyKSk/bjotMSE9PShuPXBuLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSxyKSk/bjoobj1wbi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKX1mdW5jdGlvbiBBdCh0LGUsaSl7dmFyIG8sbixzO2lmKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdClyZXR1cm4gUnQuY2FsbCh0aGlzLHQsZSxpKTtmb3IodGhpcy5fd2Vla2RheXNQYXJzZXx8KHRoaXMuX3dlZWtkYXlzUGFyc2U9W10sdGhpcy5fbWluV2Vla2RheXNQYXJzZT1bXSx0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2U9W10sdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2U9W10pLG89MDtvPDc7bysrKXtpZihuPXUoWzJlMywxXSkuZGF5KG8pLGkmJiF0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtvXSYmKHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW29dPW5ldyBSZWdFeHAoIl4iK3RoaXMud2Vla2RheXMobiwiIikucmVwbGFjZSgiLiIsIi4/IikrIiQiLCJpIiksdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW29dPW5ldyBSZWdFeHAoIl4iK3RoaXMud2Vla2RheXNTaG9ydChuLCIiKS5yZXBsYWNlKCIuIiwiLj8iKSsiJCIsImkiKSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlW29dPW5ldyBSZWdFeHAoIl4iK3RoaXMud2Vla2RheXNNaW4obiwiIikucmVwbGFjZSgiLiIsIi4/IikrIiQiLCJpIikpLHRoaXMuX3dlZWtkYXlzUGFyc2Vbb118fChzPSJeIit0aGlzLndlZWtkYXlzKG4sIiIpKyJ8XiIrdGhpcy53ZWVrZGF5c1Nob3J0KG4sIiIpKyJ8XiIrdGhpcy53ZWVrZGF5c01pbihuLCIiKSx0aGlzLl93ZWVrZGF5c1BhcnNlW29dPW5ldyBSZWdFeHAocy5yZXBsYWNlKCIuIiwiIiksImkiKSksaSYmImRkZGQiPT09ZSYmdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2Vbb10udGVzdCh0KSlyZXR1cm4gbztpZihpJiYiZGRkIj09PWUmJnRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtvXS50ZXN0KHQpKXJldHVybiBvO2lmKGkmJiJkZCI9PT1lJiZ0aGlzLl9taW5XZWVrZGF5c1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG87aWYoIWkmJnRoaXMuX3dlZWtkYXlzUGFyc2Vbb10udGVzdCh0KSlyZXR1cm4gb319ZnVuY3Rpb24genQodCl7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBudWxsIT10P3RoaXM6TmFOO3ZhciBlPXRoaXMuX2lzVVRDP3RoaXMuX2QuZ2V0VVRDRGF5KCk6dGhpcy5fZC5nZXREYXkoKTtyZXR1cm4gbnVsbCE9dD8odD1UdCh0LHRoaXMubG9jYWxlRGF0YSgpKSx0aGlzLmFkZCh0LWUsImQiKSk6ZX1mdW5jdGlvbiBMdCh0KXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGwhPXQ/dGhpczpOYU47dmFyIGU9KHRoaXMuZGF5KCkrNy10aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3cpJTc7cmV0dXJuIG51bGw9PXQ/ZTp0aGlzLmFkZCh0LWUsImQiKX1mdW5jdGlvbiBGdCh0KXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGwhPXQ/dGhpczpOYU47aWYobnVsbCE9dCl7dmFyIGU9RXQodCx0aGlzLmxvY2FsZURhdGEoKSk7cmV0dXJuIHRoaXMuZGF5KHRoaXMuZGF5KCklNz9lOmUtNyl9cmV0dXJuIHRoaXMuZGF5KCl8fDd9ZnVuY3Rpb24gQnQodCl7cmV0dXJuIHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdD8oZCh0aGlzLCJfd2Vla2RheXNSZWdleCIpfHxXdC5jYWxsKHRoaXMpLHQ/dGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c1JlZ2V4KTooZCh0aGlzLCJfd2Vla2RheXNSZWdleCIpfHwodGhpcy5fd2Vla2RheXNSZWdleD1NbiksdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCYmdD90aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzUmVnZXgpfWZ1bmN0aW9uIGp0KHQpe3JldHVybiB0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3Q/KGQodGhpcywiX3dlZWtkYXlzUmVnZXgiKXx8V3QuY2FsbCh0aGlzKSx0P3RoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXgpOihkKHRoaXMsIl93ZWVrZGF5c1Nob3J0UmVnZXgiKXx8KHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleD1TbiksdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4JiZ0P3RoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXgpfWZ1bmN0aW9uIEh0KHQpe3JldHVybiB0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3Q/KGQodGhpcywiX3dlZWtkYXlzUmVnZXgiKXx8V3QuY2FsbCh0aGlzKSx0P3RoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNNaW5SZWdleCk6KGQodGhpcywiX3dlZWtkYXlzTWluUmVnZXgiKXx8KHRoaXMuX3dlZWtkYXlzTWluUmVnZXg9RG4pLHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXgmJnQ/dGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c01pblJlZ2V4KX1mdW5jdGlvbiBXdCgpe2Z1bmN0aW9uIHQodCxlKXtyZXR1cm4gZS5sZW5ndGgtdC5sZW5ndGh9dmFyIGUsaSxvLG4scyxyPVtdLGE9W10saD1bXSxkPVtdO2ZvcihlPTA7ZTw3O2UrKylpPXUoWzJlMywxXSkuZGF5KGUpLG89dGhpcy53ZWVrZGF5c01pbihpLCIiKSxuPXRoaXMud2Vla2RheXNTaG9ydChpLCIiKSxzPXRoaXMud2Vla2RheXMoaSwiIiksci5wdXNoKG8pLGEucHVzaChuKSxoLnB1c2gocyksZC5wdXNoKG8pLGQucHVzaChuKSxkLnB1c2gocyk7Zm9yKHIuc29ydCh0KSxhLnNvcnQodCksaC5zb3J0KHQpLGQuc29ydCh0KSxlPTA7ZTw3O2UrKylhW2VdPXR0KGFbZV0pLGhbZV09dHQoaFtlXSksZFtlXT10dChkW2VdKTt0aGlzLl93ZWVrZGF5c1JlZ2V4PW5ldyBSZWdFeHAoIl4oIitkLmpvaW4oInwiKSsiKSIsImkiKSx0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg9dGhpcy5fd2Vla2RheXNSZWdleCx0aGlzLl93ZWVrZGF5c01pblJlZ2V4PXRoaXMuX3dlZWtkYXlzUmVnZXgsdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleD1uZXcgUmVnRXhwKCJeKCIraC5qb2luKCJ8IikrIikiLCJpIiksdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4PW5ldyBSZWdFeHAoIl4oIithLmpvaW4oInwiKSsiKSIsImkiKSx0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4PW5ldyBSZWdFeHAoIl4oIityLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBZdCgpe3JldHVybiB0aGlzLmhvdXJzKCklMTJ8fDEyfWZ1bmN0aW9uIEd0KCl7cmV0dXJuIHRoaXMuaG91cnMoKXx8MjR9ZnVuY3Rpb24gVnQodCxlKXtVKHQsMCwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSx0aGlzLm1pbnV0ZXMoKSxlKX0pfWZ1bmN0aW9uIFV0KHQsZSl7cmV0dXJuIGUuX21lcmlkaWVtUGFyc2V9ZnVuY3Rpb24gcXQodCl7cmV0dXJuInAiPT09KHQrIiIpLnRvTG93ZXJDYXNlKCkuY2hhckF0KDApfWZ1bmN0aW9uIFh0KHQsZSxpKXtyZXR1cm4gdD4xMT9pPyJwbSI6IlBNIjppPyJhbSI6IkFNIn1mdW5jdGlvbiBadCh0KXtyZXR1cm4gdD90LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgiXyIsIi0iKTp0fWZ1bmN0aW9uIEt0KHQpe2Zvcih2YXIgZSxpLG8sbixzPTA7czx0Lmxlbmd0aDspe2ZvcihuPVp0KHRbc10pLnNwbGl0KCItIiksZT1uLmxlbmd0aCxpPVp0KHRbcysxXSksaT1pP2kuc3BsaXQoIi0iKTpudWxsO2U+MDspe2lmKG89SnQobi5zbGljZSgwLGUpLmpvaW4oIi0iKSkpcmV0dXJuIG87aWYoaSYmaS5sZW5ndGg+PWUmJncobixpLCEwKT49ZS0xKWJyZWFrO2UtLX1zKyt9cmV0dXJuIG51bGx9ZnVuY3Rpb24gSnQoZSl7dmFyIGk9bnVsbDtpZighUG5bZV0mJnZvaWQgMCE9PXQmJnQmJnQuZXhwb3J0cyl0cnl7aT1Pbi5fYWJicixmdW5jdGlvbigpe3ZhciB0PW5ldyBFcnJvcignQ2Fubm90IGZpbmQgbW9kdWxlICIuL2xvY2FsZSInKTt0aHJvdyB0LmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLHR9KCksUXQoaSl9Y2F0Y2godCl7fXJldHVybiBQbltlXX1mdW5jdGlvbiBRdCh0LGUpe3ZhciBpO3JldHVybiB0JiYoaT1zKGUpP2VlKHQpOiR0KHQsZSkpJiYoT249aSksT24uX2FiYnJ9ZnVuY3Rpb24gJHQodCxlKXtpZihudWxsIT09ZSl7dmFyIGk9RW47aWYoZS5hYmJyPXQsbnVsbCE9UG5bdF0pTSgiZGVmaW5lTG9jYWxlT3ZlcnJpZGUiLCJ1c2UgbW9tZW50LnVwZGF0ZUxvY2FsZShsb2NhbGVOYW1lLCBjb25maWcpIHRvIGNoYW5nZSBhbiBleGlzdGluZyBsb2NhbGUuIG1vbWVudC5kZWZpbmVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGUgU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZGVmaW5lLWxvY2FsZS8gZm9yIG1vcmUgaW5mby4iKSxpPVBuW3RdLl9jb25maWc7ZWxzZSBpZihudWxsIT1lLnBhcmVudExvY2FsZSl7aWYobnVsbD09UG5bZS5wYXJlbnRMb2NhbGVdKXJldHVybiBJbltlLnBhcmVudExvY2FsZV18fChJbltlLnBhcmVudExvY2FsZV09W10pLEluW2UucGFyZW50TG9jYWxlXS5wdXNoKHtuYW1lOnQsY29uZmlnOmV9KSxudWxsO2k9UG5bZS5wYXJlbnRMb2NhbGVdLl9jb25maWd9cmV0dXJuIFBuW3RdPW5ldyBDKE8oaSxlKSksSW5bdF0mJkluW3RdLmZvckVhY2goZnVuY3Rpb24odCl7JHQodC5uYW1lLHQuY29uZmlnKX0pLFF0KHQpLFBuW3RdfXJldHVybiBkZWxldGUgUG5bdF0sbnVsbH1mdW5jdGlvbiB0ZSh0LGUpe2lmKG51bGwhPWUpe3ZhciBpLG89RW47bnVsbCE9UG5bdF0mJihvPVBuW3RdLl9jb25maWcpLGU9TyhvLGUpLGk9bmV3IEMoZSksaS5wYXJlbnRMb2NhbGU9UG5bdF0sUG5bdF09aSxRdCh0KX1lbHNlIG51bGwhPVBuW3RdJiYobnVsbCE9UG5bdF0ucGFyZW50TG9jYWxlP1BuW3RdPVBuW3RdLnBhcmVudExvY2FsZTpudWxsIT1Qblt0XSYmZGVsZXRlIFBuW3RdKTtyZXR1cm4gUG5bdF19ZnVuY3Rpb24gZWUodCl7dmFyIGU7aWYodCYmdC5fbG9jYWxlJiZ0Ll9sb2NhbGUuX2FiYnImJih0PXQuX2xvY2FsZS5fYWJiciksIXQpcmV0dXJuIE9uO2lmKCFpKHQpKXtpZihlPUp0KHQpKXJldHVybiBlO3Q9W3RdfXJldHVybiBLdCh0KX1mdW5jdGlvbiBpZSgpe3JldHVybiBPbyhQbil9ZnVuY3Rpb24gb2UodCl7dmFyIGUsaT10Ll9hO3JldHVybiBpJiYtMj09PXAodCkub3ZlcmZsb3cmJihlPWlbc25dPDB8fGlbc25dPjExP3NuOmlbcm5dPDF8fGlbcm5dPm50KGlbbm5dLGlbc25dKT9ybjppW2FuXTwwfHxpW2FuXT4yNHx8MjQ9PT1pW2FuXSYmKDAhPT1pW2huXXx8MCE9PWlbZG5dfHwwIT09aVtsbl0pP2FuOmlbaG5dPDB8fGlbaG5dPjU5P2huOmlbZG5dPDB8fGlbZG5dPjU5P2RuOmlbbG5dPDB8fGlbbG5dPjk5OT9sbjotMSxwKHQpLl9vdmVyZmxvd0RheU9mWWVhciYmKGU8bm58fGU+cm4pJiYoZT1ybikscCh0KS5fb3ZlcmZsb3dXZWVrcyYmLTE9PT1lJiYoZT11bikscCh0KS5fb3ZlcmZsb3dXZWVrZGF5JiYtMT09PWUmJihlPWNuKSxwKHQpLm92ZXJmbG93PWUpLHR9ZnVuY3Rpb24gbmUodCl7dmFyIGUsaSxvLG4scyxyLGE9dC5faSxoPU5uLmV4ZWMoYSl8fFJuLmV4ZWMoYSk7aWYoaCl7Zm9yKHAodCkuaXNvPSEwLGU9MCxpPXpuLmxlbmd0aDtlPGk7ZSsrKWlmKHpuW2VdWzFdLmV4ZWMoaFsxXSkpe249em5bZV1bMF0sbz0hMSE9PXpuW2VdWzJdO2JyZWFrfWlmKG51bGw9PW4pcmV0dXJuIHZvaWQodC5faXNWYWxpZD0hMSk7aWYoaFszXSl7Zm9yKGU9MCxpPUxuLmxlbmd0aDtlPGk7ZSsrKWlmKExuW2VdWzFdLmV4ZWMoaFszXSkpe3M9KGhbMl18fCIgIikrTG5bZV1bMF07YnJlYWt9aWYobnVsbD09cylyZXR1cm4gdm9pZCh0Ll9pc1ZhbGlkPSExKX1pZighbyYmbnVsbCE9cylyZXR1cm4gdm9pZCh0Ll9pc1ZhbGlkPSExKTtpZihoWzRdKXtpZighQW4uZXhlYyhoWzRdKSlyZXR1cm4gdm9pZCh0Ll9pc1ZhbGlkPSExKTtyPSJaIn10Ll9mPW4rKHN8fCIiKSsocnx8IiIpLHVlKHQpfWVsc2UgdC5faXNWYWxpZD0hMX1mdW5jdGlvbiBzZSh0KXt2YXIgZSxpLG8sbixzLHIsYSxoLGQ9eyIgR01UIjoiICswMDAwIiwiIEVEVCI6IiAtMDQwMCIsIiBFU1QiOiIgLTA1MDAiLCIgQ0RUIjoiIC0wNTAwIiwiIENTVCI6IiAtMDYwMCIsIiBNRFQiOiIgLTA2MDAiLCIgTVNUIjoiIC0wNzAwIiwiIFBEVCI6IiAtMDcwMCIsIiBQU1QiOiIgLTA4MDAifSxsPSJZWFdWVVRTUlFQT05aQUJDREVGR0hJS0xNIjtpZihlPXQuX2kucmVwbGFjZSgvXChbXlwpXSpcKXxbXG5cdF0vZywiICIpLnJlcGxhY2UoLyhcc1xzKykvZywiICIpLnJlcGxhY2UoL15cc3xccyQvZywiIiksaT1Cbi5leGVjKGUpKXtpZihvPWlbMV0/ImRkZCIrKDU9PT1pWzFdLmxlbmd0aD8iLCAiOiIgIik6IiIsbj0iRCBNTU0gIisoaVsyXS5sZW5ndGg+MTA/IllZWVkgIjoiWVkgIikscz0iSEg6bW0iKyhpWzRdPyI6c3MiOiIiKSxpWzFdKXt2YXIgdT1uZXcgRGF0ZShpWzJdKSxjPVsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il1bdS5nZXREYXkoKV07aWYoaVsxXS5zdWJzdHIoMCwzKSE9PWMpcmV0dXJuIHAodCkud2Vla2RheU1pc21hdGNoPSEwLHZvaWQodC5faXNWYWxpZD0hMSl9c3dpdGNoKGlbNV0ubGVuZ3RoKXtjYXNlIDI6MD09PWg/YT0iICswMDAwIjooaD1sLmluZGV4T2YoaVs1XVsxXS50b1VwcGVyQ2FzZSgpKS0xMixhPShoPDA/IiAtIjoiICsiKSsoIiIraCkucmVwbGFjZSgvXi0/LywiMCIpLm1hdGNoKC8uLiQvKVswXSsiMDAiKTticmVhaztjYXNlIDQ6YT1kW2lbNV1dO2JyZWFrO2RlZmF1bHQ6YT1kWyIgR01UIl19aVs1XT1hLHQuX2k9aS5zcGxpY2UoMSkuam9pbigiIikscj0iIFpaIix0Ll9mPW8rbitzK3IsdWUodCkscCh0KS5yZmMyODIyPSEwfWVsc2UgdC5faXNWYWxpZD0hMX1mdW5jdGlvbiByZSh0KXt2YXIgaT1Gbi5leGVjKHQuX2kpO2lmKG51bGwhPT1pKXJldHVybiB2b2lkKHQuX2Q9bmV3IERhdGUoK2lbMV0pKTtuZSh0KSwhMT09PXQuX2lzVmFsaWQmJihkZWxldGUgdC5faXNWYWxpZCxzZSh0KSwhMT09PXQuX2lzVmFsaWQmJihkZWxldGUgdC5faXNWYWxpZCxlLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKHQpKSl9ZnVuY3Rpb24gYWUodCxlLGkpe3JldHVybiBudWxsIT10P3Q6bnVsbCE9ZT9lOml9ZnVuY3Rpb24gaGUodCl7dmFyIGk9bmV3IERhdGUoZS5ub3coKSk7cmV0dXJuIHQuX3VzZVVUQz9baS5nZXRVVENGdWxsWWVhcigpLGkuZ2V0VVRDTW9udGgoKSxpLmdldFVUQ0RhdGUoKV06W2kuZ2V0RnVsbFllYXIoKSxpLmdldE1vbnRoKCksaS5nZXREYXRlKCldfWZ1bmN0aW9uIGRlKHQpe3ZhciBlLGksbyxuLHM9W107aWYoIXQuX2Qpe2ZvcihvPWhlKHQpLHQuX3cmJm51bGw9PXQuX2Fbcm5dJiZudWxsPT10Ll9hW3NuXSYmbGUodCksbnVsbCE9dC5fZGF5T2ZZZWFyJiYobj1hZSh0Ll9hW25uXSxvW25uXSksKHQuX2RheU9mWWVhcj5tdChuKXx8MD09PXQuX2RheU9mWWVhcikmJihwKHQpLl9vdmVyZmxvd0RheU9mWWVhcj0hMCksaT1idChuLDAsdC5fZGF5T2ZZZWFyKSx0Ll9hW3NuXT1pLmdldFVUQ01vbnRoKCksdC5fYVtybl09aS5nZXRVVENEYXRlKCkpLGU9MDtlPDMmJm51bGw9PXQuX2FbZV07KytlKXQuX2FbZV09c1tlXT1vW2VdO2Zvcig7ZTw3O2UrKyl0Ll9hW2VdPXNbZV09bnVsbD09dC5fYVtlXT8yPT09ZT8xOjA6dC5fYVtlXTsyND09PXQuX2FbYW5dJiYwPT09dC5fYVtobl0mJjA9PT10Ll9hW2RuXSYmMD09PXQuX2FbbG5dJiYodC5fbmV4dERheT0hMCx0Ll9hW2FuXT0wKSx0Ll9kPSh0Ll91c2VVVEM/YnQ6eXQpLmFwcGx5KG51bGwscyksbnVsbCE9dC5fdHptJiZ0Ll9kLnNldFVUQ01pbnV0ZXModC5fZC5nZXRVVENNaW51dGVzKCktdC5fdHptKSx0Ll9uZXh0RGF5JiYodC5fYVthbl09MjQpfX1mdW5jdGlvbiBsZSh0KXt2YXIgZSxpLG8sbixzLHIsYSxoO2lmKGU9dC5fdyxudWxsIT1lLkdHfHxudWxsIT1lLld8fG51bGwhPWUuRSlzPTEscj00LGk9YWUoZS5HRyx0Ll9hW25uXSx4dChiZSgpLDEsNCkueWVhciksbz1hZShlLlcsMSksKChuPWFlKGUuRSwxKSk8MXx8bj43KSYmKGg9ITApO2Vsc2V7cz10Ll9sb2NhbGUuX3dlZWsuZG93LHI9dC5fbG9jYWxlLl93ZWVrLmRveTt2YXIgZD14dChiZSgpLHMscik7aT1hZShlLmdnLHQuX2Fbbm5dLGQueWVhciksbz1hZShlLncsZC53ZWVrKSxudWxsIT1lLmQ/KChuPWUuZCk8MHx8bj42KSYmKGg9ITApOm51bGwhPWUuZT8obj1lLmUrcywoZS5lPDB8fGUuZT42KSYmKGg9ITApKTpuPXN9bzwxfHxvPmt0KGkscyxyKT9wKHQpLl9vdmVyZmxvd1dlZWtzPSEwOm51bGwhPWg/cCh0KS5fb3ZlcmZsb3dXZWVrZGF5PSEwOihhPXd0KGksbyxuLHMsciksdC5fYVtubl09YS55ZWFyLHQuX2RheU9mWWVhcj1hLmRheU9mWWVhcil9ZnVuY3Rpb24gdWUodCl7aWYodC5fZj09PWUuSVNPXzg2MDEpcmV0dXJuIHZvaWQgbmUodCk7aWYodC5fZj09PWUuUkZDXzI4MjIpcmV0dXJuIHZvaWQgc2UodCk7dC5fYT1bXSxwKHQpLmVtcHR5PSEwO3ZhciBpLG8sbixzLHIsYT0iIit0Ll9pLGg9YS5sZW5ndGgsZD0wO2ZvcihuPUsodC5fZix0Ll9sb2NhbGUpLm1hdGNoKFJvKXx8W10saT0wO2k8bi5sZW5ndGg7aSsrKXM9bltpXSxvPShhLm1hdGNoKFEocyx0KSl8fFtdKVswXSxvJiYocj1hLnN1YnN0cigwLGEuaW5kZXhPZihvKSksci5sZW5ndGg+MCYmcCh0KS51bnVzZWRJbnB1dC5wdXNoKHIpLGE9YS5zbGljZShhLmluZGV4T2Yobykrby5sZW5ndGgpLGQrPW8ubGVuZ3RoKSxMb1tzXT8obz9wKHQpLmVtcHR5PSExOnAodCkudW51c2VkVG9rZW5zLnB1c2gocyksb3QocyxvLHQpKTp0Ll9zdHJpY3QmJiFvJiZwKHQpLnVudXNlZFRva2Vucy5wdXNoKHMpO3AodCkuY2hhcnNMZWZ0T3Zlcj1oLWQsYS5sZW5ndGg+MCYmcCh0KS51bnVzZWRJbnB1dC5wdXNoKGEpLHQuX2FbYW5dPD0xMiYmITA9PT1wKHQpLmJpZ0hvdXImJnQuX2FbYW5dPjAmJihwKHQpLmJpZ0hvdXI9dm9pZCAwKSxwKHQpLnBhcnNlZERhdGVQYXJ0cz10Ll9hLnNsaWNlKDApLHAodCkubWVyaWRpZW09dC5fbWVyaWRpZW0sdC5fYVthbl09Y2UodC5fbG9jYWxlLHQuX2FbYW5dLHQuX21lcmlkaWVtKSxkZSh0KSxvZSh0KX1mdW5jdGlvbiBjZSh0LGUsaSl7dmFyIG87cmV0dXJuIG51bGw9PWk/ZTpudWxsIT10Lm1lcmlkaWVtSG91cj90Lm1lcmlkaWVtSG91cihlLGkpOm51bGwhPXQuaXNQTT8obz10LmlzUE0oaSksbyYmZTwxMiYmKGUrPTEyKSxvfHwxMiE9PWV8fChlPTApLGUpOmV9ZnVuY3Rpb24gcGUodCl7dmFyIGUsaSxvLG4scztpZigwPT09dC5fZi5sZW5ndGgpcmV0dXJuIHAodCkuaW52YWxpZEZvcm1hdD0hMCx2b2lkKHQuX2Q9bmV3IERhdGUoTmFOKSk7Zm9yKG49MDtuPHQuX2YubGVuZ3RoO24rKylzPTAsZT12KHt9LHQpLG51bGwhPXQuX3VzZVVUQyYmKGUuX3VzZVVUQz10Ll91c2VVVEMpLGUuX2Y9dC5fZltuXSx1ZShlKSxmKGUpJiYocys9cChlKS5jaGFyc0xlZnRPdmVyLHMrPTEwKnAoZSkudW51c2VkVG9rZW5zLmxlbmd0aCxwKGUpLnNjb3JlPXMsKG51bGw9PW98fHM8bykmJihvPXMsaT1lKSk7bCh0LGl8fGUpfWZ1bmN0aW9uIGZlKHQpe2lmKCF0Ll9kKXt2YXIgZT1MKHQuX2kpO3QuX2E9aChbZS55ZWFyLGUubW9udGgsZS5kYXl8fGUuZGF0ZSxlLmhvdXIsZS5taW51dGUsZS5zZWNvbmQsZS5taWxsaXNlY29uZF0sZnVuY3Rpb24odCl7cmV0dXJuIHQmJnBhcnNlSW50KHQsMTApfSksZGUodCl9fWZ1bmN0aW9uIG1lKHQpe3ZhciBlPW5ldyBnKG9lKHZlKHQpKSk7cmV0dXJuIGUuX25leHREYXkmJihlLmFkZCgxLCJkIiksZS5fbmV4dERheT12b2lkIDApLGV9ZnVuY3Rpb24gdmUodCl7dmFyIGU9dC5faSxvPXQuX2Y7cmV0dXJuIHQuX2xvY2FsZT10Ll9sb2NhbGV8fGVlKHQuX2wpLG51bGw9PT1lfHx2b2lkIDA9PT1vJiYiIj09PWU/bSh7bnVsbElucHV0OiEwfSk6KCJzdHJpbmciPT10eXBlb2YgZSYmKHQuX2k9ZT10Ll9sb2NhbGUucHJlcGFyc2UoZSkpLHkoZSk/bmV3IGcob2UoZSkpOihhKGUpP3QuX2Q9ZTppKG8pP3BlKHQpOm8/dWUodCk6Z2UodCksZih0KXx8KHQuX2Q9bnVsbCksdCkpfWZ1bmN0aW9uIGdlKHQpe3ZhciBuPXQuX2k7cyhuKT90Ll9kPW5ldyBEYXRlKGUubm93KCkpOmEobik/dC5fZD1uZXcgRGF0ZShuLnZhbHVlT2YoKSk6InN0cmluZyI9PXR5cGVvZiBuP3JlKHQpOmkobik/KHQuX2E9aChuLnNsaWNlKDApLGZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUludCh0LDEwKX0pLGRlKHQpKTpvKG4pP2ZlKHQpOnIobik/dC5fZD1uZXcgRGF0ZShuKTplLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKHQpfWZ1bmN0aW9uIHllKHQsZSxzLHIsYSl7dmFyIGg9e307cmV0dXJuITAhPT1zJiYhMSE9PXN8fChyPXMscz12b2lkIDApLChvKHQpJiZuKHQpfHxpKHQpJiYwPT09dC5sZW5ndGgpJiYodD12b2lkIDApLGguX2lzQU1vbWVudE9iamVjdD0hMCxoLl91c2VVVEM9aC5faXNVVEM9YSxoLl9sPXMsaC5faT10LGguX2Y9ZSxoLl9zdHJpY3Q9cixtZShoKX1mdW5jdGlvbiBiZSh0LGUsaSxvKXtyZXR1cm4geWUodCxlLGksbywhMSl9ZnVuY3Rpb24gX2UodCxlKXt2YXIgbyxuO2lmKDE9PT1lLmxlbmd0aCYmaShlWzBdKSYmKGU9ZVswXSksIWUubGVuZ3RoKXJldHVybiBiZSgpO2ZvcihvPWVbMF0sbj0xO248ZS5sZW5ndGg7KytuKWVbbl0uaXNWYWxpZCgpJiYhZVtuXVt0XShvKXx8KG89ZVtuXSk7cmV0dXJuIG99ZnVuY3Rpb24gd2UoKXtyZXR1cm4gX2UoImlzQmVmb3JlIixbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9ZnVuY3Rpb24geGUoKXtyZXR1cm4gX2UoImlzQWZ0ZXIiLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKX1mdW5jdGlvbiBrZSh0KXtmb3IodmFyIGUgaW4gdClpZigtMT09PVluLmluZGV4T2YoZSl8fG51bGwhPXRbZV0mJmlzTmFOKHRbZV0pKXJldHVybiExO2Zvcih2YXIgaT0hMSxvPTA7bzxZbi5sZW5ndGg7KytvKWlmKHRbWW5bb11dKXtpZihpKXJldHVybiExO3BhcnNlRmxvYXQodFtZbltvXV0pIT09Xyh0W1luW29dXSkmJihpPSEwKX1yZXR1cm4hMH1mdW5jdGlvbiBNZSgpe3JldHVybiB0aGlzLl9pc1ZhbGlkfWZ1bmN0aW9uIFNlKCl7cmV0dXJuIEdlKE5hTil9ZnVuY3Rpb24gRGUodCl7dmFyIGU9TCh0KSxpPWUueWVhcnx8MCxvPWUucXVhcnRlcnx8MCxuPWUubW9udGh8fDAscz1lLndlZWt8fDAscj1lLmRheXx8MCxhPWUuaG91cnx8MCxoPWUubWludXRlfHwwLGQ9ZS5zZWNvbmR8fDAsbD1lLm1pbGxpc2Vjb25kfHwwO3RoaXMuX2lzVmFsaWQ9a2UoZSksdGhpcy5fbWlsbGlzZWNvbmRzPStsKzFlMypkKzZlNCpoKzFlMyphKjYwKjYwLHRoaXMuX2RheXM9K3IrNypzLHRoaXMuX21vbnRocz0rbiszKm8rMTIqaSx0aGlzLl9kYXRhPXt9LHRoaXMuX2xvY2FsZT1lZSgpLHRoaXMuX2J1YmJsZSgpfWZ1bmN0aW9uIE9lKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGV9ZnVuY3Rpb24gQ2UodCl7cmV0dXJuIHQ8MD8tMSpNYXRoLnJvdW5kKC0xKnQpOk1hdGgucm91bmQodCl9ZnVuY3Rpb24gVGUodCxlKXtVKHQsMCwwLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy51dGNPZmZzZXQoKSxpPSIrIjtyZXR1cm4gdDwwJiYodD0tdCxpPSItIiksaStWKH5+KHQvNjApLDIpK2UrVih+fnQlNjAsMil9KX1mdW5jdGlvbiBFZSh0LGUpe3ZhciBpPShlfHwiIikubWF0Y2godCk7aWYobnVsbD09PWkpcmV0dXJuIG51bGw7dmFyIG89aVtpLmxlbmd0aC0xXXx8W10sbj0obysiIikubWF0Y2goR24pfHxbIi0iLDAsMF0scz02MCpuWzFdK18oblsyXSk7cmV0dXJuIDA9PT1zPzA6IisiPT09blswXT9zOi1zfWZ1bmN0aW9uIFBlKHQsaSl7dmFyIG8sbjtyZXR1cm4gaS5faXNVVEM/KG89aS5jbG9uZSgpLG49KHkodCl8fGEodCk/dC52YWx1ZU9mKCk6YmUodCkudmFsdWVPZigpKS1vLnZhbHVlT2YoKSxvLl9kLnNldFRpbWUoby5fZC52YWx1ZU9mKCkrbiksZS51cGRhdGVPZmZzZXQobywhMSksbyk6YmUodCkubG9jYWwoKX1mdW5jdGlvbiBJZSh0KXtyZXR1cm4gMTUqLU1hdGgucm91bmQodC5fZC5nZXRUaW1lem9uZU9mZnNldCgpLzE1KX1mdW5jdGlvbiBOZSh0LGksbyl7dmFyIG4scz10aGlzLl9vZmZzZXR8fDA7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBudWxsIT10P3RoaXM6TmFOO2lmKG51bGwhPXQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYobnVsbD09PSh0PUVlKFFvLHQpKSlyZXR1cm4gdGhpc31lbHNlIE1hdGguYWJzKHQpPDE2JiYhbyYmKHQqPTYwKTtyZXR1cm4hdGhpcy5faXNVVEMmJmkmJihuPUllKHRoaXMpKSx0aGlzLl9vZmZzZXQ9dCx0aGlzLl9pc1VUQz0hMCxudWxsIT1uJiZ0aGlzLmFkZChuLCJtIikscyE9PXQmJighaXx8dGhpcy5fY2hhbmdlSW5Qcm9ncmVzcz9aZSh0aGlzLEdlKHQtcywibSIpLDEsITEpOnRoaXMuX2NoYW5nZUluUHJvZ3Jlc3N8fCh0aGlzLl9jaGFuZ2VJblByb2dyZXNzPSEwLGUudXBkYXRlT2Zmc2V0KHRoaXMsITApLHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3M9bnVsbCkpLHRoaXN9cmV0dXJuIHRoaXMuX2lzVVRDP3M6SWUodGhpcyl9ZnVuY3Rpb24gUmUodCxlKXtyZXR1cm4gbnVsbCE9dD8oInN0cmluZyIhPXR5cGVvZiB0JiYodD0tdCksdGhpcy51dGNPZmZzZXQodCxlKSx0aGlzKTotdGhpcy51dGNPZmZzZXQoKX1mdW5jdGlvbiBBZSh0KXtyZXR1cm4gdGhpcy51dGNPZmZzZXQoMCx0KX1mdW5jdGlvbiB6ZSh0KXtyZXR1cm4gdGhpcy5faXNVVEMmJih0aGlzLnV0Y09mZnNldCgwLHQpLHRoaXMuX2lzVVRDPSExLHQmJnRoaXMuc3VidHJhY3QoSWUodGhpcyksIm0iKSksdGhpc31mdW5jdGlvbiBMZSgpe2lmKG51bGwhPXRoaXMuX3R6bSl0aGlzLnV0Y09mZnNldCh0aGlzLl90em0sITEsITApO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLl9pKXt2YXIgdD1FZShKbyx0aGlzLl9pKTtudWxsIT10P3RoaXMudXRjT2Zmc2V0KHQpOnRoaXMudXRjT2Zmc2V0KDAsITApfXJldHVybiB0aGlzfWZ1bmN0aW9uIEZlKHQpe3JldHVybiEhdGhpcy5pc1ZhbGlkKCkmJih0PXQ/YmUodCkudXRjT2Zmc2V0KCk6MCwodGhpcy51dGNPZmZzZXQoKS10KSU2MD09MCl9ZnVuY3Rpb24gQmUoKXtyZXR1cm4gdGhpcy51dGNPZmZzZXQoKT50aGlzLmNsb25lKCkubW9udGgoMCkudXRjT2Zmc2V0KCl8fHRoaXMudXRjT2Zmc2V0KCk+dGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpfWZ1bmN0aW9uIGplKCl7aWYoIXModGhpcy5faXNEU1RTaGlmdGVkKSlyZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO3ZhciB0PXt9O2lmKHYodCx0aGlzKSx0PXZlKHQpLHQuX2Epe3ZhciBlPXQuX2lzVVRDP3UodC5fYSk6YmUodC5fYSk7dGhpcy5faXNEU1RTaGlmdGVkPXRoaXMuaXNWYWxpZCgpJiZ3KHQuX2EsZS50b0FycmF5KCkpPjB9ZWxzZSB0aGlzLl9pc0RTVFNoaWZ0ZWQ9ITE7cmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZH1mdW5jdGlvbiBIZSgpe3JldHVybiEhdGhpcy5pc1ZhbGlkKCkmJiF0aGlzLl9pc1VUQ31mdW5jdGlvbiBXZSgpe3JldHVybiEhdGhpcy5pc1ZhbGlkKCkmJnRoaXMuX2lzVVRDfWZ1bmN0aW9uIFllKCl7cmV0dXJuISF0aGlzLmlzVmFsaWQoKSYmKHRoaXMuX2lzVVRDJiYwPT09dGhpcy5fb2Zmc2V0KX1mdW5jdGlvbiBHZSh0LGUpe3ZhciBpLG8sbixzPXQsYT1udWxsO3JldHVybiBPZSh0KT9zPXttczp0Ll9taWxsaXNlY29uZHMsZDp0Ll9kYXlzLE06dC5fbW9udGhzfTpyKHQpPyhzPXt9LGU/c1tlXT10OnMubWlsbGlzZWNvbmRzPXQpOihhPVZuLmV4ZWModCkpPyhpPSItIj09PWFbMV0/LTE6MSxzPXt5OjAsZDpfKGFbcm5dKSppLGg6XyhhW2FuXSkqaSxtOl8oYVtobl0pKmksczpfKGFbZG5dKSppLG1zOl8oQ2UoMWUzKmFbbG5dKSkqaX0pOihhPVVuLmV4ZWModCkpPyhpPSItIj09PWFbMV0/LTE6MSxzPXt5OlZlKGFbMl0saSksTTpWZShhWzNdLGkpLHc6VmUoYVs0XSxpKSxkOlZlKGFbNV0saSksaDpWZShhWzZdLGkpLG06VmUoYVs3XSxpKSxzOlZlKGFbOF0saSl9KTpudWxsPT1zP3M9e306Im9iamVjdCI9PXR5cGVvZiBzJiYoImZyb20iaW4gc3x8InRvImluIHMpJiYobj1xZShiZShzLmZyb20pLGJlKHMudG8pKSxzPXt9LHMubXM9bi5taWxsaXNlY29uZHMscy5NPW4ubW9udGhzKSxvPW5ldyBEZShzKSxPZSh0KSYmZCh0LCJfbG9jYWxlIikmJihvLl9sb2NhbGU9dC5fbG9jYWxlKSxvfWZ1bmN0aW9uIFZlKHQsZSl7dmFyIGk9dCYmcGFyc2VGbG9hdCh0LnJlcGxhY2UoIiwiLCIuIikpO3JldHVybihpc05hTihpKT8wOmkpKmV9ZnVuY3Rpb24gVWUodCxlKXt2YXIgaT17bWlsbGlzZWNvbmRzOjAsbW9udGhzOjB9O3JldHVybiBpLm1vbnRocz1lLm1vbnRoKCktdC5tb250aCgpKzEyKihlLnllYXIoKS10LnllYXIoKSksdC5jbG9uZSgpLmFkZChpLm1vbnRocywiTSIpLmlzQWZ0ZXIoZSkmJi0taS5tb250aHMsaS5taWxsaXNlY29uZHM9K2UtK3QuY2xvbmUoKS5hZGQoaS5tb250aHMsIk0iKSxpfWZ1bmN0aW9uIHFlKHQsZSl7dmFyIGk7cmV0dXJuIHQuaXNWYWxpZCgpJiZlLmlzVmFsaWQoKT8oZT1QZShlLHQpLHQuaXNCZWZvcmUoZSk/aT1VZSh0LGUpOihpPVVlKGUsdCksaS5taWxsaXNlY29uZHM9LWkubWlsbGlzZWNvbmRzLGkubW9udGhzPS1pLm1vbnRocyksaSk6e21pbGxpc2Vjb25kczowLG1vbnRoczowfX1mdW5jdGlvbiBYZSh0LGUpe3JldHVybiBmdW5jdGlvbihpLG8pe3ZhciBuLHM7cmV0dXJuIG51bGw9PT1vfHxpc05hTigrbyl8fChNKGUsIm1vbWVudCgpLiIrZSsiKHBlcmlvZCwgbnVtYmVyKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIG1vbWVudCgpLiIrZSsiKG51bWJlciwgcGVyaW9kKS4gU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvYWRkLWludmVydGVkLXBhcmFtLyBmb3IgbW9yZSBpbmZvLiIpLHM9aSxpPW8sbz1zKSxpPSJzdHJpbmciPT10eXBlb2YgaT8raTppLG49R2UoaSxvKSxaZSh0aGlzLG4sdCksdGhpc319ZnVuY3Rpb24gWmUodCxpLG8sbil7dmFyIHM9aS5fbWlsbGlzZWNvbmRzLHI9Q2UoaS5fZGF5cyksYT1DZShpLl9tb250aHMpO3QuaXNWYWxpZCgpJiYobj1udWxsPT1ufHxuLHMmJnQuX2Quc2V0VGltZSh0Ll9kLnZhbHVlT2YoKStzKm8pLHImJlcodCwiRGF0ZSIsSCh0LCJEYXRlIikrcipvKSxhJiZkdCh0LEgodCwiTW9udGgiKSthKm8pLG4mJmUudXBkYXRlT2Zmc2V0KHQscnx8YSkpfWZ1bmN0aW9uIEtlKHQsZSl7dmFyIGk9dC5kaWZmKGUsImRheXMiLCEwKTtyZXR1cm4gaTwtNj8ic2FtZUVsc2UiOmk8LTE/Imxhc3RXZWVrIjppPDA/Imxhc3REYXkiOmk8MT8ic2FtZURheSI6aTwyPyJuZXh0RGF5IjppPDc/Im5leHRXZWVrIjoic2FtZUVsc2UifWZ1bmN0aW9uIEplKHQsaSl7dmFyIG89dHx8YmUoKSxuPVBlKG8sdGhpcykuc3RhcnRPZigiZGF5Iikscz1lLmNhbGVuZGFyRm9ybWF0KHRoaXMsbil8fCJzYW1lRWxzZSIscj1pJiYoUyhpW3NdKT9pW3NdLmNhbGwodGhpcyxvKTppW3NdKTtyZXR1cm4gdGhpcy5mb3JtYXQocnx8dGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIocyx0aGlzLGJlKG8pKSl9ZnVuY3Rpb24gUWUoKXtyZXR1cm4gbmV3IGcodGhpcyl9ZnVuY3Rpb24gJGUodCxlKXt2YXIgaT15KHQpP3Q6YmUodCk7cmV0dXJuISghdGhpcy5pc1ZhbGlkKCl8fCFpLmlzVmFsaWQoKSkmJihlPXoocyhlKT8ibWlsbGlzZWNvbmQiOmUpLCJtaWxsaXNlY29uZCI9PT1lP3RoaXMudmFsdWVPZigpPmkudmFsdWVPZigpOmkudmFsdWVPZigpPHRoaXMuY2xvbmUoKS5zdGFydE9mKGUpLnZhbHVlT2YoKSl9ZnVuY3Rpb24gdGkodCxlKXt2YXIgaT15KHQpP3Q6YmUodCk7cmV0dXJuISghdGhpcy5pc1ZhbGlkKCl8fCFpLmlzVmFsaWQoKSkmJihlPXoocyhlKT8ibWlsbGlzZWNvbmQiOmUpLCJtaWxsaXNlY29uZCI9PT1lP3RoaXMudmFsdWVPZigpPGkudmFsdWVPZigpOnRoaXMuY2xvbmUoKS5lbmRPZihlKS52YWx1ZU9mKCk8aS52YWx1ZU9mKCkpfWZ1bmN0aW9uIGVpKHQsZSxpLG8pe3JldHVybiBvPW98fCIoKSIsKCIoIj09PW9bMF0/dGhpcy5pc0FmdGVyKHQsaSk6IXRoaXMuaXNCZWZvcmUodCxpKSkmJigiKSI9PT1vWzFdP3RoaXMuaXNCZWZvcmUoZSxpKTohdGhpcy5pc0FmdGVyKGUsaSkpfWZ1bmN0aW9uIGlpKHQsZSl7dmFyIGksbz15KHQpP3Q6YmUodCk7cmV0dXJuISghdGhpcy5pc1ZhbGlkKCl8fCFvLmlzVmFsaWQoKSkmJihlPXooZXx8Im1pbGxpc2Vjb25kIiksIm1pbGxpc2Vjb25kIj09PWU/dGhpcy52YWx1ZU9mKCk9PT1vLnZhbHVlT2YoKTooaT1vLnZhbHVlT2YoKSx0aGlzLmNsb25lKCkuc3RhcnRPZihlKS52YWx1ZU9mKCk8PWkmJmk8PXRoaXMuY2xvbmUoKS5lbmRPZihlKS52YWx1ZU9mKCkpKX1mdW5jdGlvbiBvaSh0LGUpe3JldHVybiB0aGlzLmlzU2FtZSh0LGUpfHx0aGlzLmlzQWZ0ZXIodCxlKX1mdW5jdGlvbiBuaSh0LGUpe3JldHVybiB0aGlzLmlzU2FtZSh0LGUpfHx0aGlzLmlzQmVmb3JlKHQsZSl9ZnVuY3Rpb24gc2kodCxlLGkpe3ZhciBvLG4scyxyO3JldHVybiB0aGlzLmlzVmFsaWQoKT8obz1QZSh0LHRoaXMpLG8uaXNWYWxpZCgpPyhuPTZlNCooby51dGNPZmZzZXQoKS10aGlzLnV0Y09mZnNldCgpKSxlPXooZSksInllYXIiPT09ZXx8Im1vbnRoIj09PWV8fCJxdWFydGVyIj09PWU/KHI9cmkodGhpcyxvKSwicXVhcnRlciI9PT1lP3IvPTM6InllYXIiPT09ZSYmKHIvPTEyKSk6KHM9dGhpcy1vLHI9InNlY29uZCI9PT1lP3MvMWUzOiJtaW51dGUiPT09ZT9zLzZlNDoiaG91ciI9PT1lP3MvMzZlNToiZGF5Ij09PWU/KHMtbikvODY0ZTU6IndlZWsiPT09ZT8ocy1uKS82MDQ4ZTU6cyksaT9yOmIocikpOk5hTik6TmFOfWZ1bmN0aW9uIHJpKHQsZSl7dmFyIGksbyxuPTEyKihlLnllYXIoKS10LnllYXIoKSkrKGUubW9udGgoKS10Lm1vbnRoKCkpLHM9dC5jbG9uZSgpLmFkZChuLCJtb250aHMiKTtyZXR1cm4gZS1zPDA/KGk9dC5jbG9uZSgpLmFkZChuLTEsIm1vbnRocyIpLG89KGUtcykvKHMtaSkpOihpPXQuY2xvbmUoKS5hZGQobisxLCJtb250aHMiKSxvPShlLXMpLyhpLXMpKSwtKG4rbyl8fDB9ZnVuY3Rpb24gYWkoKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgiZW4iKS5mb3JtYXQoImRkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaIil9ZnVuY3Rpb24gaGkoKXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5jbG9uZSgpLnV0YygpO3JldHVybiB0LnllYXIoKTwwfHx0LnllYXIoKT45OTk5P1oodCwiWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdIik6UyhEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyk/dGhpcy50b0RhdGUoKS50b0lTT1N0cmluZygpOloodCwiWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXSIpfWZ1bmN0aW9uIGRpKCl7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiJtb21lbnQuaW52YWxpZCgvKiAiK3RoaXMuX2krIiAqLykiO3ZhciB0PSJtb21lbnQiLGU9IiI7dGhpcy5pc0xvY2FsKCl8fCh0PTA9PT10aGlzLnV0Y09mZnNldCgpPyJtb21lbnQudXRjIjoibW9tZW50LnBhcnNlWm9uZSIsZT0iWiIpO3ZhciBpPSJbIit0KycoIl0nLG89MDw9dGhpcy55ZWFyKCkmJnRoaXMueWVhcigpPD05OTk5PyJZWVlZIjoiWVlZWVlZIixuPWUrJ1siKV0nO3JldHVybiB0aGlzLmZvcm1hdChpK28rIi1NTS1ERFtUXUhIOm1tOnNzLlNTUyIrbil9ZnVuY3Rpb24gbGkodCl7dHx8KHQ9dGhpcy5pc1V0YygpP2UuZGVmYXVsdEZvcm1hdFV0YzplLmRlZmF1bHRGb3JtYXQpO3ZhciBpPVoodGhpcyx0KTtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkucG9zdGZvcm1hdChpKX1mdW5jdGlvbiB1aSh0LGUpe3JldHVybiB0aGlzLmlzVmFsaWQoKSYmKHkodCkmJnQuaXNWYWxpZCgpfHxiZSh0KS5pc1ZhbGlkKCkpP0dlKHt0bzp0aGlzLGZyb206dH0pLmxvY2FsZSh0aGlzLmxvY2FsZSgpKS5odW1hbml6ZSghZSk6dGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKX1mdW5jdGlvbiBjaSh0KXtyZXR1cm4gdGhpcy5mcm9tKGJlKCksdCl9ZnVuY3Rpb24gcGkodCxlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJih5KHQpJiZ0LmlzVmFsaWQoKXx8YmUodCkuaXNWYWxpZCgpKT9HZSh7ZnJvbTp0aGlzLHRvOnR9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIWUpOnRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24gZmkodCl7cmV0dXJuIHRoaXMudG8oYmUoKSx0KX1mdW5jdGlvbiBtaSh0KXt2YXIgZTtyZXR1cm4gdm9pZCAwPT09dD90aGlzLl9sb2NhbGUuX2FiYnI6KGU9ZWUodCksbnVsbCE9ZSYmKHRoaXMuX2xvY2FsZT1lKSx0aGlzKX1mdW5jdGlvbiB2aSgpe3JldHVybiB0aGlzLl9sb2NhbGV9ZnVuY3Rpb24gZ2kodCl7c3dpdGNoKHQ9eih0KSl7Y2FzZSJ5ZWFyIjp0aGlzLm1vbnRoKDApO2Nhc2UicXVhcnRlciI6Y2FzZSJtb250aCI6dGhpcy5kYXRlKDEpO2Nhc2Uid2VlayI6Y2FzZSJpc29XZWVrIjpjYXNlImRheSI6Y2FzZSJkYXRlIjp0aGlzLmhvdXJzKDApO2Nhc2UiaG91ciI6dGhpcy5taW51dGVzKDApO2Nhc2UibWludXRlIjp0aGlzLnNlY29uZHMoMCk7Y2FzZSJzZWNvbmQiOnRoaXMubWlsbGlzZWNvbmRzKDApfXJldHVybiJ3ZWVrIj09PXQmJnRoaXMud2Vla2RheSgwKSwiaXNvV2VlayI9PT10JiZ0aGlzLmlzb1dlZWtkYXkoMSksInF1YXJ0ZXIiPT09dCYmdGhpcy5tb250aCgzKk1hdGguZmxvb3IodGhpcy5tb250aCgpLzMpKSx0aGlzfWZ1bmN0aW9uIHlpKHQpe3JldHVybiB2b2lkIDA9PT0odD16KHQpKXx8Im1pbGxpc2Vjb25kIj09PXQ/dGhpczooImRhdGUiPT09dCYmKHQ9ImRheSIpLHRoaXMuc3RhcnRPZih0KS5hZGQoMSwiaXNvV2VlayI9PT10PyJ3ZWVrIjp0KS5zdWJ0cmFjdCgxLCJtcyIpKX1mdW5jdGlvbiBiaSgpe3JldHVybiB0aGlzLl9kLnZhbHVlT2YoKS02ZTQqKHRoaXMuX29mZnNldHx8MCl9ZnVuY3Rpb24gX2koKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKS8xZTMpfWZ1bmN0aW9uIHdpKCl7cmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKX1mdW5jdGlvbiB4aSgpe3ZhciB0PXRoaXM7cmV0dXJuW3QueWVhcigpLHQubW9udGgoKSx0LmRhdGUoKSx0LmhvdXIoKSx0Lm1pbnV0ZSgpLHQuc2Vjb25kKCksdC5taWxsaXNlY29uZCgpXX1mdW5jdGlvbiBraSgpe3ZhciB0PXRoaXM7cmV0dXJue3llYXJzOnQueWVhcigpLG1vbnRoczp0Lm1vbnRoKCksZGF0ZTp0LmRhdGUoKSxob3Vyczp0LmhvdXJzKCksbWludXRlczp0Lm1pbnV0ZXMoKSxzZWNvbmRzOnQuc2Vjb25kcygpLG1pbGxpc2Vjb25kczp0Lm1pbGxpc2Vjb25kcygpfX1mdW5jdGlvbiBNaSgpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLnRvSVNPU3RyaW5nKCk6bnVsbH1mdW5jdGlvbiBTaSgpe3JldHVybiBmKHRoaXMpfWZ1bmN0aW9uIERpKCl7cmV0dXJuIGwoe30scCh0aGlzKSl9ZnVuY3Rpb24gT2koKXtyZXR1cm4gcCh0aGlzKS5vdmVyZmxvd31mdW5jdGlvbiBDaSgpe3JldHVybntpbnB1dDp0aGlzLl9pLGZvcm1hdDp0aGlzLl9mLGxvY2FsZTp0aGlzLl9sb2NhbGUsaXNVVEM6dGhpcy5faXNVVEMsc3RyaWN0OnRoaXMuX3N0cmljdH19ZnVuY3Rpb24gVGkodCxlKXtVKDAsW3QsdC5sZW5ndGhdLDAsZSl9ZnVuY3Rpb24gRWkodCl7cmV0dXJuIFJpLmNhbGwodGhpcyx0LHRoaXMud2VlaygpLHRoaXMud2Vla2RheSgpLHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyx0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpfWZ1bmN0aW9uIFBpKHQpe3JldHVybiBSaS5jYWxsKHRoaXMsdCx0aGlzLmlzb1dlZWsoKSx0aGlzLmlzb1dlZWtkYXkoKSwxLDQpfWZ1bmN0aW9uIElpKCl7cmV0dXJuIGt0KHRoaXMueWVhcigpLDEsNCl9ZnVuY3Rpb24gTmkoKXt2YXIgdD10aGlzLmxvY2FsZURhdGEoKS5fd2VlaztyZXR1cm4ga3QodGhpcy55ZWFyKCksdC5kb3csdC5kb3kpfWZ1bmN0aW9uIFJpKHQsZSxpLG8sbil7dmFyIHM7cmV0dXJuIG51bGw9PXQ/eHQodGhpcyxvLG4pLnllYXI6KHM9a3QodCxvLG4pLGU+cyYmKGU9cyksQWkuY2FsbCh0aGlzLHQsZSxpLG8sbikpfWZ1bmN0aW9uIEFpKHQsZSxpLG8sbil7dmFyIHM9d3QodCxlLGksbyxuKSxyPWJ0KHMueWVhciwwLHMuZGF5T2ZZZWFyKTtyZXR1cm4gdGhpcy55ZWFyKHIuZ2V0VVRDRnVsbFllYXIoKSksdGhpcy5tb250aChyLmdldFVUQ01vbnRoKCkpLHRoaXMuZGF0ZShyLmdldFVUQ0RhdGUoKSksdGhpc31mdW5jdGlvbiB6aSh0KXtyZXR1cm4gbnVsbD09dD9NYXRoLmNlaWwoKHRoaXMubW9udGgoKSsxKS8zKTp0aGlzLm1vbnRoKDMqKHQtMSkrdGhpcy5tb250aCgpJTMpfWZ1bmN0aW9uIExpKHQpe3ZhciBlPU1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKCJkYXkiKS10aGlzLmNsb25lKCkuc3RhcnRPZigieWVhciIpKS84NjRlNSkrMTtyZXR1cm4gbnVsbD09dD9lOnRoaXMuYWRkKHQtZSwiZCIpfWZ1bmN0aW9uIEZpKHQsZSl7ZVtsbl09XygxZTMqKCIwLiIrdCkpfWZ1bmN0aW9uIEJpKCl7cmV0dXJuIHRoaXMuX2lzVVRDPyJVVEMiOiIifWZ1bmN0aW9uIGppKCl7cmV0dXJuIHRoaXMuX2lzVVRDPyJDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSI6IiJ9ZnVuY3Rpb24gSGkodCl7cmV0dXJuIGJlKDFlMyp0KX1mdW5jdGlvbiBXaSgpe3JldHVybiBiZS5hcHBseShudWxsLGFyZ3VtZW50cykucGFyc2Vab25lKCl9ZnVuY3Rpb24gWWkodCl7cmV0dXJuIHR9ZnVuY3Rpb24gR2kodCxlLGksbyl7dmFyIG49ZWUoKSxzPXUoKS5zZXQobyxlKTtyZXR1cm4gbltpXShzLHQpfWZ1bmN0aW9uIFZpKHQsZSxpKXtpZihyKHQpJiYoZT10LHQ9dm9pZCAwKSx0PXR8fCIiLG51bGwhPWUpcmV0dXJuIEdpKHQsZSxpLCJtb250aCIpO3ZhciBvLG49W107Zm9yKG89MDtvPDEyO28rKyluW29dPUdpKHQsbyxpLCJtb250aCIpO3JldHVybiBufWZ1bmN0aW9uIFVpKHQsZSxpLG8peyJib29sZWFuIj09dHlwZW9mIHQ/KHIoZSkmJihpPWUsZT12b2lkIDApLGU9ZXx8IiIpOihlPXQsaT1lLHQ9ITEscihlKSYmKGk9ZSxlPXZvaWQgMCksZT1lfHwiIik7dmFyIG49ZWUoKSxzPXQ/bi5fd2Vlay5kb3c6MDtpZihudWxsIT1pKXJldHVybiBHaShlLChpK3MpJTcsbywiZGF5Iik7dmFyIGEsaD1bXTtmb3IoYT0wO2E8NzthKyspaFthXT1HaShlLChhK3MpJTcsbywiZGF5Iik7cmV0dXJuIGh9ZnVuY3Rpb24gcWkodCxlKXtyZXR1cm4gVmkodCxlLCJtb250aHMiKX1mdW5jdGlvbiBYaSh0LGUpe3JldHVybiBWaSh0LGUsIm1vbnRoc1Nob3J0Iil9ZnVuY3Rpb24gWmkodCxlLGkpe3JldHVybiBVaSh0LGUsaSwid2Vla2RheXMiKX1mdW5jdGlvbiBLaSh0LGUsaSl7cmV0dXJuIFVpKHQsZSxpLCJ3ZWVrZGF5c1Nob3J0Iil9ZnVuY3Rpb24gSmkodCxlLGkpe3JldHVybiBVaSh0LGUsaSwid2Vla2RheXNNaW4iKX1mdW5jdGlvbiBRaSgpewp2YXIgdD10aGlzLl9kYXRhO3JldHVybiB0aGlzLl9taWxsaXNlY29uZHM9b3ModGhpcy5fbWlsbGlzZWNvbmRzKSx0aGlzLl9kYXlzPW9zKHRoaXMuX2RheXMpLHRoaXMuX21vbnRocz1vcyh0aGlzLl9tb250aHMpLHQubWlsbGlzZWNvbmRzPW9zKHQubWlsbGlzZWNvbmRzKSx0LnNlY29uZHM9b3ModC5zZWNvbmRzKSx0Lm1pbnV0ZXM9b3ModC5taW51dGVzKSx0LmhvdXJzPW9zKHQuaG91cnMpLHQubW9udGhzPW9zKHQubW9udGhzKSx0LnllYXJzPW9zKHQueWVhcnMpLHRoaXN9ZnVuY3Rpb24gJGkodCxlLGksbyl7dmFyIG49R2UoZSxpKTtyZXR1cm4gdC5fbWlsbGlzZWNvbmRzKz1vKm4uX21pbGxpc2Vjb25kcyx0Ll9kYXlzKz1vKm4uX2RheXMsdC5fbW9udGhzKz1vKm4uX21vbnRocyx0Ll9idWJibGUoKX1mdW5jdGlvbiB0byh0LGUpe3JldHVybiAkaSh0aGlzLHQsZSwxKX1mdW5jdGlvbiBlbyh0LGUpe3JldHVybiAkaSh0aGlzLHQsZSwtMSl9ZnVuY3Rpb24gaW8odCl7cmV0dXJuIHQ8MD9NYXRoLmZsb29yKHQpOk1hdGguY2VpbCh0KX1mdW5jdGlvbiBvbygpe3ZhciB0LGUsaSxvLG4scz10aGlzLl9taWxsaXNlY29uZHMscj10aGlzLl9kYXlzLGE9dGhpcy5fbW9udGhzLGg9dGhpcy5fZGF0YTtyZXR1cm4gcz49MCYmcj49MCYmYT49MHx8czw9MCYmcjw9MCYmYTw9MHx8KHMrPTg2NGU1KmlvKHNvKGEpK3IpLHI9MCxhPTApLGgubWlsbGlzZWNvbmRzPXMlMWUzLHQ9YihzLzFlMyksaC5zZWNvbmRzPXQlNjAsZT1iKHQvNjApLGgubWludXRlcz1lJTYwLGk9YihlLzYwKSxoLmhvdXJzPWklMjQscis9YihpLzI0KSxuPWIobm8ocikpLGErPW4sci09aW8oc28obikpLG89YihhLzEyKSxhJT0xMixoLmRheXM9cixoLm1vbnRocz1hLGgueWVhcnM9byx0aGlzfWZ1bmN0aW9uIG5vKHQpe3JldHVybiA0ODAwKnQvMTQ2MDk3fWZ1bmN0aW9uIHNvKHQpe3JldHVybiAxNDYwOTcqdC80ODAwfWZ1bmN0aW9uIHJvKHQpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gTmFOO3ZhciBlLGksbz10aGlzLl9taWxsaXNlY29uZHM7aWYoIm1vbnRoIj09PSh0PXoodCkpfHwieWVhciI9PT10KXJldHVybiBlPXRoaXMuX2RheXMrby84NjRlNSxpPXRoaXMuX21vbnRocytubyhlKSwibW9udGgiPT09dD9pOmkvMTI7c3dpdGNoKGU9dGhpcy5fZGF5cytNYXRoLnJvdW5kKHNvKHRoaXMuX21vbnRocykpLHQpe2Nhc2Uid2VlayI6cmV0dXJuIGUvNytvLzYwNDhlNTtjYXNlImRheSI6cmV0dXJuIGUrby84NjRlNTtjYXNlImhvdXIiOnJldHVybiAyNCplK28vMzZlNTtjYXNlIm1pbnV0ZSI6cmV0dXJuIDE0NDAqZStvLzZlNDtjYXNlInNlY29uZCI6cmV0dXJuIDg2NDAwKmUrby8xZTM7Y2FzZSJtaWxsaXNlY29uZCI6cmV0dXJuIE1hdGguZmxvb3IoODY0ZTUqZSkrbztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biB1bml0ICIrdCl9fWZ1bmN0aW9uIGFvKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMuX21pbGxpc2Vjb25kcys4NjRlNSp0aGlzLl9kYXlzK3RoaXMuX21vbnRocyUxMioyNTkyZTYrMzE1MzZlNipfKHRoaXMuX21vbnRocy8xMik6TmFOfWZ1bmN0aW9uIGhvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLmFzKHQpfX1mdW5jdGlvbiBsbyh0KXtyZXR1cm4gdD16KHQpLHRoaXMuaXNWYWxpZCgpP3RoaXNbdCsicyJdKCk6TmFOfWZ1bmN0aW9uIHVvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLl9kYXRhW3RdOk5hTn19ZnVuY3Rpb24gY28oKXtyZXR1cm4gYih0aGlzLmRheXMoKS83KX1mdW5jdGlvbiBwbyh0LGUsaSxvLG4pe3JldHVybiBuLnJlbGF0aXZlVGltZShlfHwxLCEhaSx0LG8pfWZ1bmN0aW9uIGZvKHQsZSxpKXt2YXIgbz1HZSh0KS5hYnMoKSxuPWJzKG8uYXMoInMiKSkscz1icyhvLmFzKCJtIikpLHI9YnMoby5hcygiaCIpKSxhPWJzKG8uYXMoImQiKSksaD1icyhvLmFzKCJNIikpLGQ9YnMoby5hcygieSIpKSxsPW48PV9zLnNzJiZbInMiLG5dfHxuPF9zLnMmJlsic3MiLG5dfHxzPD0xJiZbIm0iXXx8czxfcy5tJiZbIm1tIixzXXx8cjw9MSYmWyJoIl18fHI8X3MuaCYmWyJoaCIscl18fGE8PTEmJlsiZCJdfHxhPF9zLmQmJlsiZGQiLGFdfHxoPD0xJiZbIk0iXXx8aDxfcy5NJiZbIk1NIixoXXx8ZDw9MSYmWyJ5Il18fFsieXkiLGRdO3JldHVybiBsWzJdPWUsbFszXT0rdD4wLGxbNF09aSxwby5hcHBseShudWxsLGwpfWZ1bmN0aW9uIG1vKHQpe3JldHVybiB2b2lkIDA9PT10P2JzOiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoYnM9dCwhMCl9ZnVuY3Rpb24gdm8odCxlKXtyZXR1cm4gdm9pZCAwIT09X3NbdF0mJih2b2lkIDA9PT1lP19zW3RdOihfc1t0XT1lLCJzIj09PXQmJihfcy5zcz1lLTEpLCEwKSl9ZnVuY3Rpb24gZ28odCl7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO3ZhciBlPXRoaXMubG9jYWxlRGF0YSgpLGk9Zm8odGhpcywhdCxlKTtyZXR1cm4gdCYmKGk9ZS5wYXN0RnV0dXJlKCt0aGlzLGkpKSxlLnBvc3Rmb3JtYXQoaSl9ZnVuY3Rpb24geW8oKXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7dmFyIHQsZSxpLG89d3ModGhpcy5fbWlsbGlzZWNvbmRzKS8xZTMsbj13cyh0aGlzLl9kYXlzKSxzPXdzKHRoaXMuX21vbnRocyk7dD1iKG8vNjApLGU9Yih0LzYwKSxvJT02MCx0JT02MCxpPWIocy8xMikscyU9MTI7dmFyIHI9aSxhPXMsaD1uLGQ9ZSxsPXQsdT1vLGM9dGhpcy5hc1NlY29uZHMoKTtyZXR1cm4gYz8oYzwwPyItIjoiIikrIlAiKyhyP3IrIlkiOiIiKSsoYT9hKyJNIjoiIikrKGg/aCsiRCI6IiIpKyhkfHxsfHx1PyJUIjoiIikrKGQ/ZCsiSCI6IiIpKyhsP2wrIk0iOiIiKSsodT91KyJTIjoiIik6IlAwRCJ9dmFyIGJvLF9vO19vPUFycmF5LnByb3RvdHlwZS5zb21lP0FycmF5LnByb3RvdHlwZS5zb21lOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1PYmplY3QodGhpcyksaT1lLmxlbmd0aD4+PjAsbz0wO288aTtvKyspaWYobyBpbiBlJiZ0LmNhbGwodGhpcyxlW29dLG8sZSkpcmV0dXJuITA7cmV0dXJuITF9O3ZhciB3bz1fbyx4bz1lLm1vbWVudFByb3BlcnRpZXM9W10sa289ITEsTW89e307ZS5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3M9ITEsZS5kZXByZWNhdGlvbkhhbmRsZXI9bnVsbDt2YXIgU287U289T2JqZWN0LmtleXM/T2JqZWN0LmtleXM6ZnVuY3Rpb24odCl7dmFyIGUsaT1bXTtmb3IoZSBpbiB0KWQodCxlKSYmaS5wdXNoKGUpO3JldHVybiBpfTt2YXIgRG8sT289U28sQ289e3NhbWVEYXk6IltUb2RheSBhdF0gTFQiLG5leHREYXk6IltUb21vcnJvdyBhdF0gTFQiLG5leHRXZWVrOiJkZGRkIFthdF0gTFQiLGxhc3REYXk6IltZZXN0ZXJkYXkgYXRdIExUIixsYXN0V2VlazoiW0xhc3RdIGRkZGQgW2F0XSBMVCIsc2FtZUVsc2U6IkwifSxUbz17TFRTOiJoOm1tOnNzIEEiLExUOiJoOm1tIEEiLEw6Ik1NL0REL1lZWVkiLExMOiJNTU1NIEQsIFlZWVkiLExMTDoiTU1NTSBELCBZWVlZIGg6bW0gQSIsTExMTDoiZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQSJ9LEVvPS9cZHsxLDJ9LyxQbz17ZnV0dXJlOiJpbiAlcyIscGFzdDoiJXMgYWdvIixzOiJhIGZldyBzZWNvbmRzIixzczoiJWQgc2Vjb25kcyIsbToiYSBtaW51dGUiLG1tOiIlZCBtaW51dGVzIixoOiJhbiBob3VyIixoaDoiJWQgaG91cnMiLGQ6ImEgZGF5IixkZDoiJWQgZGF5cyIsTToiYSBtb250aCIsTU06IiVkIG1vbnRocyIseToiYSB5ZWFyIix5eToiJWQgeWVhcnMifSxJbz17fSxObz17fSxSbz0vKFxbW15cW10qXF0pfChcXCk/KFtIaF1tbShzcyk/fE1vfE1NP00/TT98RG98REREb3xERD9EP0Q/fGRkZD9kP3xkbz98d1tvfHddP3xXW298V10/fFFvP3xZWVlZWVl8WVlZWVl8WVlZWXxZWXxnZyhnZ2c/KT98R0coR0dHPyk/fGV8RXxhfEF8aGg/fEhIP3xraz98bW0/fHNzP3xTezEsOX18eHxYfHp6P3xaWj98LikvZyxBbz0vKFxbW15cW10qXF0pfChcXCk/KExUU3xMVHxMTD9MP0w/fGx7MSw0fSkvZyx6bz17fSxMbz17fSxGbz0vXGQvLEJvPS9cZFxkLyxqbz0vXGR7M30vLEhvPS9cZHs0fS8sV289L1srLV0/XGR7Nn0vLFlvPS9cZFxkPy8sR289L1xkXGRcZFxkPy8sVm89L1xkXGRcZFxkXGRcZD8vLFVvPS9cZHsxLDN9Lyxxbz0vXGR7MSw0fS8sWG89L1srLV0/XGR7MSw2fS8sWm89L1xkKy8sS289L1srLV0/XGQrLyxKbz0vWnxbKy1dXGRcZDo/XGRcZC9naSxRbz0vWnxbKy1dXGRcZCg/Ojo/XGRcZCk/L2dpLCRvPS9bKy1dP1xkKyhcLlxkezEsM30pPy8sdG49L1swLTldKlsnYS16XHUwMEEwLVx1MDVGRlx1MDcwMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0rfFtcdTA2MDAtXHUwNkZGXC9dKyhccyo/W1x1MDYwMC1cdTA2RkZdKyl7MSwyfS9pLGVuPXt9LG9uPXt9LG5uPTAsc249MSxybj0yLGFuPTMsaG49NCxkbj01LGxuPTYsdW49Nyxjbj04O0RvPUFycmF5LnByb3RvdHlwZS5pbmRleE9mP0FycmF5LnByb3RvdHlwZS5pbmRleE9mOmZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlPTA7ZTx0aGlzLmxlbmd0aDsrK2UpaWYodGhpc1tlXT09PXQpcmV0dXJuIGU7cmV0dXJuLTF9O3ZhciBwbj1EbztVKCJNIixbIk1NIiwyXSwiTW8iLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW9udGgoKSsxfSksVSgiTU1NIiwwLDAsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0KHRoaXMsdCl9KSxVKCJNTU1NIiwwLDAsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLHQpfSksQSgibW9udGgiLCJNIiksRigibW9udGgiLDgpLEooIk0iLFlvKSxKKCJNTSIsWW8sQm8pLEooIk1NTSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5tb250aHNTaG9ydFJlZ2V4KHQpfSksSigiTU1NTSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5tb250aHNSZWdleCh0KX0pLGV0KFsiTSIsIk1NIl0sZnVuY3Rpb24odCxlKXtlW3NuXT1fKHQpLTF9KSxldChbIk1NTSIsIk1NTU0iXSxmdW5jdGlvbih0LGUsaSxvKXt2YXIgbj1pLl9sb2NhbGUubW9udGhzUGFyc2UodCxvLGkuX3N0cmljdCk7bnVsbCE9bj9lW3NuXT1uOnAoaSkuaW52YWxpZE1vbnRoPXR9KTt2YXIgZm49L0Rbb0RdPyhcW1teXFtcXV0qXF18XHMpK01NTU0/Lyxtbj0iSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlciIuc3BsaXQoIl8iKSx2bj0iSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMiLnNwbGl0KCJfIiksZ249dG4seW49dG47VSgiWSIsMCwwLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55ZWFyKCk7cmV0dXJuIHQ8PTk5OTk/IiIrdDoiKyIrdH0pLFUoMCxbIllZIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWVhcigpJTEwMH0pLFUoMCxbIllZWVkiLDRdLDAsInllYXIiKSxVKDAsWyJZWVlZWSIsNV0sMCwieWVhciIpLFUoMCxbIllZWVlZWSIsNiwhMF0sMCwieWVhciIpLEEoInllYXIiLCJ5IiksRigieWVhciIsMSksSigiWSIsS28pLEooIllZIixZbyxCbyksSigiWVlZWSIscW8sSG8pLEooIllZWVlZIixYbyxXbyksSigiWVlZWVlZIixYbyxXbyksZXQoWyJZWVlZWSIsIllZWVlZWSJdLG5uKSxldCgiWVlZWSIsZnVuY3Rpb24odCxpKXtpW25uXT0yPT09dC5sZW5ndGg/ZS5wYXJzZVR3b0RpZ2l0WWVhcih0KTpfKHQpfSksZXQoIllZIixmdW5jdGlvbih0LGkpe2lbbm5dPWUucGFyc2VUd29EaWdpdFllYXIodCl9KSxldCgiWSIsZnVuY3Rpb24odCxlKXtlW25uXT1wYXJzZUludCh0LDEwKX0pLGUucGFyc2VUd29EaWdpdFllYXI9ZnVuY3Rpb24odCl7cmV0dXJuIF8odCkrKF8odCk+Njg/MTkwMDoyZTMpfTt2YXIgYm49aigiRnVsbFllYXIiLCEwKTtVKCJ3IixbInd3IiwyXSwid28iLCJ3ZWVrIiksVSgiVyIsWyJXVyIsMl0sIldvIiwiaXNvV2VlayIpLEEoIndlZWsiLCJ3IiksQSgiaXNvV2VlayIsIlciKSxGKCJ3ZWVrIiw1KSxGKCJpc29XZWVrIiw1KSxKKCJ3IixZbyksSigid3ciLFlvLEJvKSxKKCJXIixZbyksSigiV1ciLFlvLEJvKSxpdChbInciLCJ3dyIsIlciLCJXVyJdLGZ1bmN0aW9uKHQsZSxpLG8pe2Vbby5zdWJzdHIoMCwxKV09Xyh0KX0pO3ZhciBfbj17ZG93OjAsZG95OjZ9O1UoImQiLDAsImRvIiwiZGF5IiksVSgiZGQiLDAsMCxmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcyx0KX0pLFUoImRkZCIsMCwwLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsdCl9KSxVKCJkZGRkIiwwLDAsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsdCl9KSxVKCJlIiwwLDAsIndlZWtkYXkiKSxVKCJFIiwwLDAsImlzb1dlZWtkYXkiKSxBKCJkYXkiLCJkIiksQSgid2Vla2RheSIsImUiKSxBKCJpc29XZWVrZGF5IiwiRSIpLEYoImRheSIsMTEpLEYoIndlZWtkYXkiLDExKSxGKCJpc29XZWVrZGF5IiwxMSksSigiZCIsWW8pLEooImUiLFlvKSxKKCJFIixZbyksSigiZGQiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUud2Vla2RheXNNaW5SZWdleCh0KX0pLEooImRkZCIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZS53ZWVrZGF5c1Nob3J0UmVnZXgodCl9KSxKKCJkZGRkIixmdW5jdGlvbih0LGUpe3JldHVybiBlLndlZWtkYXlzUmVnZXgodCl9KSxpdChbImRkIiwiZGRkIiwiZGRkZCJdLGZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPWkuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKHQsbyxpLl9zdHJpY3QpO251bGwhPW4/ZS5kPW46cChpKS5pbnZhbGlkV2Vla2RheT10fSksaXQoWyJkIiwiZSIsIkUiXSxmdW5jdGlvbih0LGUsaSxvKXtlW29dPV8odCl9KTt2YXIgd249IlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Ii5zcGxpdCgiXyIpLHhuPSJTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQiLnNwbGl0KCJfIiksa249IlN1X01vX1R1X1dlX1RoX0ZyX1NhIi5zcGxpdCgiXyIpLE1uPXRuLFNuPXRuLERuPXRuO1UoIkgiLFsiSEgiLDJdLDAsImhvdXIiKSxVKCJoIixbImhoIiwyXSwwLFl0KSxVKCJrIixbImtrIiwyXSwwLEd0KSxVKCJobW0iLDAsMCxmdW5jdGlvbigpe3JldHVybiIiK1l0LmFwcGx5KHRoaXMpK1YodGhpcy5taW51dGVzKCksMil9KSxVKCJobW1zcyIsMCwwLGZ1bmN0aW9uKCl7cmV0dXJuIiIrWXQuYXBwbHkodGhpcykrVih0aGlzLm1pbnV0ZXMoKSwyKStWKHRoaXMuc2Vjb25kcygpLDIpfSksVSgiSG1tIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm4iIit0aGlzLmhvdXJzKCkrVih0aGlzLm1pbnV0ZXMoKSwyKX0pLFUoIkhtbXNzIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm4iIit0aGlzLmhvdXJzKCkrVih0aGlzLm1pbnV0ZXMoKSwyKStWKHRoaXMuc2Vjb25kcygpLDIpfSksVnQoImEiLCEwKSxWdCgiQSIsITEpLEEoImhvdXIiLCJoIiksRigiaG91ciIsMTMpLEooImEiLFV0KSxKKCJBIixVdCksSigiSCIsWW8pLEooImgiLFlvKSxKKCJrIixZbyksSigiSEgiLFlvLEJvKSxKKCJoaCIsWW8sQm8pLEooImtrIixZbyxCbyksSigiaG1tIixHbyksSigiaG1tc3MiLFZvKSxKKCJIbW0iLEdvKSxKKCJIbW1zcyIsVm8pLGV0KFsiSCIsIkhIIl0sYW4pLGV0KFsiayIsImtrIl0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPV8odCk7ZVthbl09MjQ9PT1vPzA6b30pLGV0KFsiYSIsIkEiXSxmdW5jdGlvbih0LGUsaSl7aS5faXNQbT1pLl9sb2NhbGUuaXNQTSh0KSxpLl9tZXJpZGllbT10fSksZXQoWyJoIiwiaGgiXSxmdW5jdGlvbih0LGUsaSl7ZVthbl09Xyh0KSxwKGkpLmJpZ0hvdXI9ITB9KSxldCgiaG1tIixmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5sZW5ndGgtMjtlW2FuXT1fKHQuc3Vic3RyKDAsbykpLGVbaG5dPV8odC5zdWJzdHIobykpLHAoaSkuYmlnSG91cj0hMH0pLGV0KCJobW1zcyIsZnVuY3Rpb24odCxlLGkpe3ZhciBvPXQubGVuZ3RoLTQsbj10Lmxlbmd0aC0yO2VbYW5dPV8odC5zdWJzdHIoMCxvKSksZVtobl09Xyh0LnN1YnN0cihvLDIpKSxlW2RuXT1fKHQuc3Vic3RyKG4pKSxwKGkpLmJpZ0hvdXI9ITB9KSxldCgiSG1tIixmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5sZW5ndGgtMjtlW2FuXT1fKHQuc3Vic3RyKDAsbykpLGVbaG5dPV8odC5zdWJzdHIobykpfSksZXQoIkhtbXNzIixmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5sZW5ndGgtNCxuPXQubGVuZ3RoLTI7ZVthbl09Xyh0LnN1YnN0cigwLG8pKSxlW2huXT1fKHQuc3Vic3RyKG8sMikpLGVbZG5dPV8odC5zdWJzdHIobikpfSk7dmFyIE9uLENuPS9bYXBdXC4/bT9cLj8vaSxUbj1qKCJIb3VycyIsITApLEVuPXtjYWxlbmRhcjpDbyxsb25nRGF0ZUZvcm1hdDpUbyxpbnZhbGlkRGF0ZToiSW52YWxpZCBkYXRlIixvcmRpbmFsOiIlZCIsZGF5T2ZNb250aE9yZGluYWxQYXJzZTpFbyxyZWxhdGl2ZVRpbWU6UG8sbW9udGhzOm1uLG1vbnRoc1Nob3J0OnZuLHdlZWs6X24sd2Vla2RheXM6d24sd2Vla2RheXNNaW46a24sd2Vla2RheXNTaG9ydDp4bixtZXJpZGllbVBhcnNlOkNufSxQbj17fSxJbj17fSxObj0vXlxzKigoPzpbKy1dXGR7Nn18XGR7NH0pLSg/OlxkXGQtXGRcZHxXXGRcZC1cZHxXXGRcZHxcZFxkXGR8XGRcZCkpKD86KFR8ICkoXGRcZCg/OjpcZFxkKD86OlxkXGQoPzpbLixdXGQrKT8pPyk/KShbXCtcLV1cZFxkKD86Oj9cZFxkKT98XHMqWik/KT8kLyxSbj0vXlxzKigoPzpbKy1dXGR7Nn18XGR7NH0pKD86XGRcZFxkXGR8V1xkXGRcZHxXXGRcZHxcZFxkXGR8XGRcZCkpKD86KFR8ICkoXGRcZCg/OlxkXGQoPzpcZFxkKD86Wy4sXVxkKyk/KT8pPykoW1wrXC1dXGRcZCg/Ojo/XGRcZCk/fFxzKlopPyk/JC8sQW49L1p8WystXVxkXGQoPzo6P1xkXGQpPy8sem49W1siWVlZWVlZLU1NLUREIiwvWystXVxkezZ9LVxkXGQtXGRcZC9dLFsiWVlZWS1NTS1ERCIsL1xkezR9LVxkXGQtXGRcZC9dLFsiR0dHRy1bV11XVy1FIiwvXGR7NH0tV1xkXGQtXGQvXSxbIkdHR0ctW1ddV1ciLC9cZHs0fS1XXGRcZC8sITFdLFsiWVlZWS1EREQiLC9cZHs0fS1cZHszfS9dLFsiWVlZWS1NTSIsL1xkezR9LVxkXGQvLCExXSxbIllZWVlZWU1NREQiLC9bKy1dXGR7MTB9L10sWyJZWVlZTU1ERCIsL1xkezh9L10sWyJHR0dHW1ddV1dFIiwvXGR7NH1XXGR7M30vXSxbIkdHR0dbV11XVyIsL1xkezR9V1xkezJ9LywhMV0sWyJZWVlZREREIiwvXGR7N30vXV0sTG49W1siSEg6bW06c3MuU1NTUyIsL1xkXGQ6XGRcZDpcZFxkXC5cZCsvXSxbIkhIOm1tOnNzLFNTU1MiLC9cZFxkOlxkXGQ6XGRcZCxcZCsvXSxbIkhIOm1tOnNzIiwvXGRcZDpcZFxkOlxkXGQvXSxbIkhIOm1tIiwvXGRcZDpcZFxkL10sWyJISG1tc3MuU1NTUyIsL1xkXGRcZFxkXGRcZFwuXGQrL10sWyJISG1tc3MsU1NTUyIsL1xkXGRcZFxkXGRcZCxcZCsvXSxbIkhIbW1zcyIsL1xkXGRcZFxkXGRcZC9dLFsiSEhtbSIsL1xkXGRcZFxkL10sWyJISCIsL1xkXGQvXV0sRm49L15cLz9EYXRlXCgoXC0/XGQrKS9pLEJuPS9eKCg/Ok1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksP1xzKT8oXGQ/XGRccyg/OkphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxzKD86XGRcZCk/XGRcZFxzKShcZFxkOlxkXGQpKFw6XGRcZCk/KFxzKD86VVR8R01UfFtFQ01QXVtTRF1UfFtBLUlLLVphLWlrLXpdfFsrLV1cZHs0fSkpJC87ZS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjaz1rKCJ2YWx1ZSBwcm92aWRlZCBpcyBub3QgaW4gYSByZWNvZ25pemVkIFJGQzI4MjIgb3IgSVNPIGZvcm1hdC4gbW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUoKSwgd2hpY2ggaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBhbGwgYnJvd3NlcnMgYW5kIHZlcnNpb25zLiBOb24gUkZDMjgyMi9JU08gZGF0ZSBmb3JtYXRzIGFyZSBkaXNjb3VyYWdlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIG1ham9yIHJlbGVhc2UuIFBsZWFzZSByZWZlciB0byBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2pzLWRhdGUvIGZvciBtb3JlIGluZm8uIixmdW5jdGlvbih0KXt0Ll9kPW5ldyBEYXRlKHQuX2krKHQuX3VzZVVUQz8iIFVUQyI6IiIpKX0pLGUuSVNPXzg2MDE9ZnVuY3Rpb24oKXt9LGUuUkZDXzI4MjI9ZnVuY3Rpb24oKXt9O3ZhciBqbj1rKCJtb21lbnQoKS5taW4gaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5tYXggaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LyIsZnVuY3Rpb24oKXt2YXIgdD1iZS5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZ0LmlzVmFsaWQoKT90PHRoaXM/dGhpczp0Om0oKX0pLEhuPWsoIm1vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1pbiBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvIixmdW5jdGlvbigpe3ZhciB0PWJlLmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJnQuaXNWYWxpZCgpP3Q+dGhpcz90aGlzOnQ6bSgpfSksV249ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3c/RGF0ZS5ub3coKTorbmV3IERhdGV9LFluPVsieWVhciIsInF1YXJ0ZXIiLCJtb250aCIsIndlZWsiLCJkYXkiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwibWlsbGlzZWNvbmQiXTtUZSgiWiIsIjoiKSxUZSgiWloiLCIiKSxKKCJaIixRbyksSigiWloiLFFvKSxldChbIloiLCJaWiJdLGZ1bmN0aW9uKHQsZSxpKXtpLl91c2VVVEM9ITAsaS5fdHptPUVlKFFvLHQpfSk7dmFyIEduPS8oW1wrXC1dfFxkXGQpL2dpO2UudXBkYXRlT2Zmc2V0PWZ1bmN0aW9uKCl7fTt2YXIgVm49L14oXC0pPyg/OihcZCopWy4gXSk/KFxkKylcOihcZCspKD86XDooXGQrKShcLlxkKik/KT8kLyxVbj0vXigtKT9QKD86KC0/WzAtOSwuXSopWSk/KD86KC0/WzAtOSwuXSopTSk/KD86KC0/WzAtOSwuXSopVyk/KD86KC0/WzAtOSwuXSopRCk/KD86VCg/OigtP1swLTksLl0qKUgpPyg/OigtP1swLTksLl0qKU0pPyg/OigtP1swLTksLl0qKVMpPyk/JC87R2UuZm49RGUucHJvdG90eXBlLEdlLmludmFsaWQ9U2U7dmFyIHFuPVhlKDEsImFkZCIpLFhuPVhlKC0xLCJzdWJ0cmFjdCIpO2UuZGVmYXVsdEZvcm1hdD0iWVlZWS1NTS1ERFRISDptbTpzc1oiLGUuZGVmYXVsdEZvcm1hdFV0Yz0iWVlZWS1NTS1ERFRISDptbTpzc1taXSI7dmFyIFpuPWsoIm1vbWVudCgpLmxhbmcoKSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgbW9tZW50KCkubG9jYWxlRGF0YSgpIHRvIGdldCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbi4gVXNlIG1vbWVudCgpLmxvY2FsZSgpIHRvIGNoYW5nZSBsYW5ndWFnZXMuIixmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmxvY2FsZURhdGEoKTp0aGlzLmxvY2FsZSh0KX0pO1UoMCxbImdnIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2Vla1llYXIoKSUxMDB9KSxVKDAsWyJHRyIsMl0sMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzb1dlZWtZZWFyKCklMTAwfSksVGkoImdnZ2ciLCJ3ZWVrWWVhciIpLFRpKCJnZ2dnZyIsIndlZWtZZWFyIiksVGkoIkdHR0ciLCJpc29XZWVrWWVhciIpLFRpKCJHR0dHRyIsImlzb1dlZWtZZWFyIiksQSgid2Vla1llYXIiLCJnZyIpLEEoImlzb1dlZWtZZWFyIiwiR0ciKSxGKCJ3ZWVrWWVhciIsMSksRigiaXNvV2Vla1llYXIiLDEpLEooIkciLEtvKSxKKCJnIixLbyksSigiR0ciLFlvLEJvKSxKKCJnZyIsWW8sQm8pLEooIkdHR0ciLHFvLEhvKSxKKCJnZ2dnIixxbyxIbyksSigiR0dHR0ciLFhvLFdvKSxKKCJnZ2dnZyIsWG8sV28pLGl0KFsiZ2dnZyIsImdnZ2dnIiwiR0dHRyIsIkdHR0dHIl0sZnVuY3Rpb24odCxlLGksbyl7ZVtvLnN1YnN0cigwLDIpXT1fKHQpfSksaXQoWyJnZyIsIkdHIl0sZnVuY3Rpb24odCxpLG8sbil7aVtuXT1lLnBhcnNlVHdvRGlnaXRZZWFyKHQpfSksVSgiUSIsMCwiUW8iLCJxdWFydGVyIiksQSgicXVhcnRlciIsIlEiKSxGKCJxdWFydGVyIiw3KSxKKCJRIixGbyksZXQoIlEiLGZ1bmN0aW9uKHQsZSl7ZVtzbl09MyooXyh0KS0xKX0pLFUoIkQiLFsiREQiLDJdLCJEbyIsImRhdGUiKSxBKCJkYXRlIiwiRCIpLEYoImRhdGUiLDkpLEooIkQiLFlvKSxKKCJERCIsWW8sQm8pLEooIkRvIixmdW5jdGlvbih0LGUpe3JldHVybiB0P2UuX2RheU9mTW9udGhPcmRpbmFsUGFyc2V8fGUuX29yZGluYWxQYXJzZTplLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudH0pLGV0KFsiRCIsIkREIl0scm4pLGV0KCJEbyIsZnVuY3Rpb24odCxlKXtlW3JuXT1fKHQubWF0Y2goWW8pWzBdLDEwKX0pO3ZhciBLbj1qKCJEYXRlIiwhMCk7VSgiREREIixbIkREREQiLDNdLCJERERvIiwiZGF5T2ZZZWFyIiksQSgiZGF5T2ZZZWFyIiwiREREIiksRigiZGF5T2ZZZWFyIiw0KSxKKCJEREQiLFVvKSxKKCJEREREIixqbyksZXQoWyJEREQiLCJEREREIl0sZnVuY3Rpb24odCxlLGkpe2kuX2RheU9mWWVhcj1fKHQpfSksVSgibSIsWyJtbSIsMl0sMCwibWludXRlIiksQSgibWludXRlIiwibSIpLEYoIm1pbnV0ZSIsMTQpLEooIm0iLFlvKSxKKCJtbSIsWW8sQm8pLGV0KFsibSIsIm1tIl0saG4pO3ZhciBKbj1qKCJNaW51dGVzIiwhMSk7VSgicyIsWyJzcyIsMl0sMCwic2Vjb25kIiksQSgic2Vjb25kIiwicyIpLEYoInNlY29uZCIsMTUpLEooInMiLFlvKSxKKCJzcyIsWW8sQm8pLGV0KFsicyIsInNzIl0sZG4pO3ZhciBRbj1qKCJTZWNvbmRzIiwhMSk7VSgiUyIsMCwwLGZ1bmN0aW9uKCl7cmV0dXJufn4odGhpcy5taWxsaXNlY29uZCgpLzEwMCl9KSxVKDAsWyJTUyIsMl0sMCxmdW5jdGlvbigpe3JldHVybn5+KHRoaXMubWlsbGlzZWNvbmQoKS8xMCl9KSxVKDAsWyJTU1MiLDNdLDAsIm1pbGxpc2Vjb25kIiksVSgwLFsiU1NTUyIsNF0sMCxmdW5jdGlvbigpe3JldHVybiAxMCp0aGlzLm1pbGxpc2Vjb25kKCl9KSxVKDAsWyJTU1NTUyIsNV0sMCxmdW5jdGlvbigpe3JldHVybiAxMDAqdGhpcy5taWxsaXNlY29uZCgpfSksVSgwLFsiU1NTU1NTIiw2XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlMyp0aGlzLm1pbGxpc2Vjb25kKCl9KSxVKDAsWyJTU1NTU1NTIiw3XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlNCp0aGlzLm1pbGxpc2Vjb25kKCl9KSxVKDAsWyJTU1NTU1NTUyIsOF0sMCxmdW5jdGlvbigpe3JldHVybiAxZTUqdGhpcy5taWxsaXNlY29uZCgpfSksVSgwLFsiU1NTU1NTU1NTIiw5XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlNip0aGlzLm1pbGxpc2Vjb25kKCl9KSxBKCJtaWxsaXNlY29uZCIsIm1zIiksRigibWlsbGlzZWNvbmQiLDE2KSxKKCJTIixVbyxGbyksSigiU1MiLFVvLEJvKSxKKCJTU1MiLFVvLGpvKTt2YXIgJG47Zm9yKCRuPSJTU1NTIjskbi5sZW5ndGg8PTk7JG4rPSJTIilKKCRuLFpvKTtmb3IoJG49IlMiOyRuLmxlbmd0aDw9OTskbis9IlMiKWV0KCRuLEZpKTt2YXIgdHM9aigiTWlsbGlzZWNvbmRzIiwhMSk7VSgieiIsMCwwLCJ6b25lQWJiciIpLFUoInp6IiwwLDAsInpvbmVOYW1lIik7dmFyIGVzPWcucHJvdG90eXBlO2VzLmFkZD1xbixlcy5jYWxlbmRhcj1KZSxlcy5jbG9uZT1RZSxlcy5kaWZmPXNpLGVzLmVuZE9mPXlpLGVzLmZvcm1hdD1saSxlcy5mcm9tPXVpLGVzLmZyb21Ob3c9Y2ksZXMudG89cGksZXMudG9Ob3c9ZmksZXMuZ2V0PVksZXMuaW52YWxpZEF0PU9pLGVzLmlzQWZ0ZXI9JGUsZXMuaXNCZWZvcmU9dGksZXMuaXNCZXR3ZWVuPWVpLGVzLmlzU2FtZT1paSxlcy5pc1NhbWVPckFmdGVyPW9pLGVzLmlzU2FtZU9yQmVmb3JlPW5pLGVzLmlzVmFsaWQ9U2ksZXMubGFuZz1abixlcy5sb2NhbGU9bWksZXMubG9jYWxlRGF0YT12aSxlcy5tYXg9SG4sZXMubWluPWpuLGVzLnBhcnNpbmdGbGFncz1EaSxlcy5zZXQ9Ryxlcy5zdGFydE9mPWdpLGVzLnN1YnRyYWN0PVhuLGVzLnRvQXJyYXk9eGksZXMudG9PYmplY3Q9a2ksZXMudG9EYXRlPXdpLGVzLnRvSVNPU3RyaW5nPWhpLGVzLmluc3BlY3Q9ZGksZXMudG9KU09OPU1pLGVzLnRvU3RyaW5nPWFpLGVzLnVuaXg9X2ksZXMudmFsdWVPZj1iaSxlcy5jcmVhdGlvbkRhdGE9Q2ksZXMueWVhcj1ibixlcy5pc0xlYXBZZWFyPWd0LGVzLndlZWtZZWFyPUVpLGVzLmlzb1dlZWtZZWFyPVBpLGVzLnF1YXJ0ZXI9ZXMucXVhcnRlcnM9emksZXMubW9udGg9bHQsZXMuZGF5c0luTW9udGg9dXQsZXMud2Vlaz1lcy53ZWVrcz1PdCxlcy5pc29XZWVrPWVzLmlzb1dlZWtzPUN0LGVzLndlZWtzSW5ZZWFyPU5pLGVzLmlzb1dlZWtzSW5ZZWFyPUlpLGVzLmRhdGU9S24sZXMuZGF5PWVzLmRheXM9enQsZXMud2Vla2RheT1MdCxlcy5pc29XZWVrZGF5PUZ0LGVzLmRheU9mWWVhcj1MaSxlcy5ob3VyPWVzLmhvdXJzPVRuLGVzLm1pbnV0ZT1lcy5taW51dGVzPUpuLGVzLnNlY29uZD1lcy5zZWNvbmRzPVFuLGVzLm1pbGxpc2Vjb25kPWVzLm1pbGxpc2Vjb25kcz10cyxlcy51dGNPZmZzZXQ9TmUsZXMudXRjPUFlLGVzLmxvY2FsPXplLGVzLnBhcnNlWm9uZT1MZSxlcy5oYXNBbGlnbmVkSG91ck9mZnNldD1GZSxlcy5pc0RTVD1CZSxlcy5pc0xvY2FsPUhlLGVzLmlzVXRjT2Zmc2V0PVdlLGVzLmlzVXRjPVllLGVzLmlzVVRDPVllLGVzLnpvbmVBYmJyPUJpLGVzLnpvbmVOYW1lPWppLGVzLmRhdGVzPWsoImRhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuIixLbiksZXMubW9udGhzPWsoIm1vbnRocyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgbW9udGggaW5zdGVhZCIsbHQpLGVzLnllYXJzPWsoInllYXJzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSB5ZWFyIGluc3RlYWQiLGJuKSxlcy56b25lPWsoIm1vbWVudCgpLnpvbmUgaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudCgpLnV0Y09mZnNldCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL3pvbmUvIixSZSksZXMuaXNEU1RTaGlmdGVkPWsoImlzRFNUU2hpZnRlZCBpcyBkZXByZWNhdGVkLiBTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kc3Qtc2hpZnRlZC8gZm9yIG1vcmUgaW5mb3JtYXRpb24iLGplKTt2YXIgaXM9Qy5wcm90b3R5cGU7aXMuY2FsZW5kYXI9VCxpcy5sb25nRGF0ZUZvcm1hdD1FLGlzLmludmFsaWREYXRlPVAsaXMub3JkaW5hbD1JLGlzLnByZXBhcnNlPVlpLGlzLnBvc3Rmb3JtYXQ9WWksaXMucmVsYXRpdmVUaW1lPU4saXMucGFzdEZ1dHVyZT1SLGlzLnNldD1ELGlzLm1vbnRocz1zdCxpcy5tb250aHNTaG9ydD1ydCxpcy5tb250aHNQYXJzZT1odCxpcy5tb250aHNSZWdleD1wdCxpcy5tb250aHNTaG9ydFJlZ2V4PWN0LGlzLndlZWs9TXQsaXMuZmlyc3REYXlPZlllYXI9RHQsaXMuZmlyc3REYXlPZldlZWs9U3QsaXMud2Vla2RheXM9UHQsaXMud2Vla2RheXNNaW49TnQsaXMud2Vla2RheXNTaG9ydD1JdCxpcy53ZWVrZGF5c1BhcnNlPUF0LGlzLndlZWtkYXlzUmVnZXg9QnQsaXMud2Vla2RheXNTaG9ydFJlZ2V4PWp0LGlzLndlZWtkYXlzTWluUmVnZXg9SHQsaXMuaXNQTT1xdCxpcy5tZXJpZGllbT1YdCxRdCgiZW4iLHtkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOi9cZHsxLDJ9KHRofHN0fG5kfHJkKS8sb3JkaW5hbDpmdW5jdGlvbih0KXt2YXIgZT10JTEwO3JldHVybiB0KygxPT09Xyh0JTEwMC8xMCk/InRoIjoxPT09ZT8ic3QiOjI9PT1lPyJuZCI6Mz09PWU/InJkIjoidGgiKX19KSxlLmxhbmc9aygibW9tZW50LmxhbmcgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGUgaW5zdGVhZC4iLFF0KSxlLmxhbmdEYXRhPWsoIm1vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC4iLGVlKTt2YXIgb3M9TWF0aC5hYnMsbnM9aG8oIm1zIiksc3M9aG8oInMiKSxycz1obygibSIpLGFzPWhvKCJoIiksaHM9aG8oImQiKSxkcz1obygidyIpLGxzPWhvKCJNIiksdXM9aG8oInkiKSxjcz11bygibWlsbGlzZWNvbmRzIikscHM9dW8oInNlY29uZHMiKSxmcz11bygibWludXRlcyIpLG1zPXVvKCJob3VycyIpLHZzPXVvKCJkYXlzIiksZ3M9dW8oIm1vbnRocyIpLHlzPXVvKCJ5ZWFycyIpLGJzPU1hdGgucm91bmQsX3M9e3NzOjQ0LHM6NDUsbTo0NSxoOjIyLGQ6MjYsTToxMX0sd3M9TWF0aC5hYnMseHM9RGUucHJvdG90eXBlO3JldHVybiB4cy5pc1ZhbGlkPU1lLHhzLmFicz1RaSx4cy5hZGQ9dG8seHMuc3VidHJhY3Q9ZW8seHMuYXM9cm8seHMuYXNNaWxsaXNlY29uZHM9bnMseHMuYXNTZWNvbmRzPXNzLHhzLmFzTWludXRlcz1ycyx4cy5hc0hvdXJzPWFzLHhzLmFzRGF5cz1ocyx4cy5hc1dlZWtzPWRzLHhzLmFzTW9udGhzPWxzLHhzLmFzWWVhcnM9dXMseHMudmFsdWVPZj1hbyx4cy5fYnViYmxlPW9vLHhzLmdldD1sbyx4cy5taWxsaXNlY29uZHM9Y3MseHMuc2Vjb25kcz1wcyx4cy5taW51dGVzPWZzLHhzLmhvdXJzPW1zLHhzLmRheXM9dnMseHMud2Vla3M9Y28seHMubW9udGhzPWdzLHhzLnllYXJzPXlzLHhzLmh1bWFuaXplPWdvLHhzLnRvSVNPU3RyaW5nPXlvLHhzLnRvU3RyaW5nPXlvLHhzLnRvSlNPTj15byx4cy5sb2NhbGU9bWkseHMubG9jYWxlRGF0YT12aSx4cy50b0lzb1N0cmluZz1rKCJ0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKSIseW8pLHhzLmxhbmc9Wm4sVSgiWCIsMCwwLCJ1bml4IiksVSgieCIsMCwwLCJ2YWx1ZU9mIiksSigieCIsS28pLEooIlgiLCRvKSxldCgiWCIsZnVuY3Rpb24odCxlLGkpe2kuX2Q9bmV3IERhdGUoMWUzKnBhcnNlRmxvYXQodCwxMCkpfSksZXQoIngiLGZ1bmN0aW9uKHQsZSxpKXtpLl9kPW5ldyBEYXRlKF8odCkpfSksZS52ZXJzaW9uPSIyLjE4LjEiLGZ1bmN0aW9uKHQpe2JvPXR9KGJlKSxlLmZuPWVzLGUubWluPXdlLGUubWF4PXhlLGUubm93PVduLGUudXRjPXUsZS51bml4PUhpLGUubW9udGhzPXFpLGUuaXNEYXRlPWEsZS5sb2NhbGU9UXQsZS5pbnZhbGlkPW0sZS5kdXJhdGlvbj1HZSxlLmlzTW9tZW50PXksZS53ZWVrZGF5cz1aaSxlLnBhcnNlWm9uZT1XaSxlLmxvY2FsZURhdGE9ZWUsZS5pc0R1cmF0aW9uPU9lLGUubW9udGhzU2hvcnQ9WGksZS53ZWVrZGF5c01pbj1KaSxlLmRlZmluZUxvY2FsZT0kdCxlLnVwZGF0ZUxvY2FsZT10ZSxlLmxvY2FsZXM9aWUsZS53ZWVrZGF5c1Nob3J0PUtpLGUubm9ybWFsaXplVW5pdHM9eixlLnJlbGF0aXZlVGltZVJvdW5kaW5nPW1vLGUucmVsYXRpdmVUaW1lVGhyZXNob2xkPXZvLGUuY2FsZW5kYXJGb3JtYXQ9S2UsZS5wcm90b3R5cGU9ZXMsZX0pfSkuY2FsbChlLGkoODQpKHQpKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQud2VicGFja1BvbHlmaWxsfHwodC5kZXByZWNhdGU9ZnVuY3Rpb24oKXt9LHQucGF0aHM9W10sdC5jaGlsZHJlbj1bXSx0LndlYnBhY2tQb2x5ZmlsbD0xKSx0fX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK3QrIicuIil9aS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuW119LGkucmVzb2x2ZT1pLHQuZXhwb3J0cz1pLGkuaWQ9ODV9LGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGkodCxlLGkpe3ZhciBvPWUmJml8fDAsbj0wO2ZvcihlPWV8fFtdLHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bMC05YS1mXXsyfS9nLGZ1bmN0aW9uKHQpe248MTYmJihlW28rbisrXT11W3RdKX0pO248MTY7KWVbbytuKytdPTA7cmV0dXJuIGV9ZnVuY3Rpb24gbyh0LGUpe3ZhciBpPWV8fDAsbz1sO3JldHVybiBvW3RbaSsrXV0rb1t0W2krK11dK29bdFtpKytdXStvW3RbaSsrXV0rIi0iK29bdFtpKytdXStvW3RbaSsrXV0rIi0iK29bdFtpKytdXStvW3RbaSsrXV0rIi0iK29bdFtpKytdXStvW3RbaSsrXV0rIi0iK29bdFtpKytdXStvW3RbaSsrXV0rb1t0W2krK11dK29bdFtpKytdXStvW3RbaSsrXV0rb1t0W2krK11dfWZ1bmN0aW9uIG4odCxlLGkpe3ZhciBuPWUmJml8fDAscz1lfHxbXTt0PXR8fHt9O3ZhciByPXZvaWQgMCE9PXQuY2xvY2tzZXE/dC5jbG9ja3NlcTptLGE9dm9pZCAwIT09dC5tc2Vjcz90Lm1zZWNzOihuZXcgRGF0ZSkuZ2V0VGltZSgpLGg9dm9pZCAwIT09dC5uc2Vjcz90Lm5zZWNzOmcrMSxkPWEtdisoaC1nKS8xZTQ7aWYoZDwwJiZ2b2lkIDA9PT10LmNsb2Nrc2VxJiYocj1yKzEmMTYzODMpLChkPDB8fGE+dikmJnZvaWQgMD09PXQubnNlY3MmJihoPTApLGg+PTFlNCl0aHJvdyBuZXcgRXJyb3IoInV1aWQudjEoKTogQ2FuJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjIik7dj1hLGc9aCxtPXIsYSs9MTIyMTkyOTI4ZTU7dmFyIGw9KDFlNCooMjY4NDM1NDU1JmEpK2gpJTQyOTQ5NjcyOTY7c1tuKytdPWw+Pj4yNCYyNTUsc1tuKytdPWw+Pj4xNiYyNTUsc1tuKytdPWw+Pj44JjI1NSxzW24rK109MjU1Jmw7dmFyIHU9YS80Mjk0OTY3Mjk2KjFlNCYyNjg0MzU0NTU7c1tuKytdPXU+Pj44JjI1NSxzW24rK109MjU1JnUsc1tuKytdPXU+Pj4yNCYxNXwxNixzW24rK109dT4+PjE2JjI1NSxzW24rK109cj4+Pjh8MTI4LHNbbisrXT0yNTUmcjtmb3IodmFyIGM9dC5ub2RlfHxmLHA9MDtwPDY7cCsrKXNbbitwXT1jW3BdO3JldHVybiBlfHxvKHMpfWZ1bmN0aW9uIHModCxlLGkpe3ZhciBuPWUmJml8fDA7InN0cmluZyI9PXR5cGVvZiB0JiYoZT0iYmluYXJ5Ij09dD9uZXcgQXJyYXkoMTYpOm51bGwsdD1udWxsKSx0PXR8fHt9O3ZhciBzPXQucmFuZG9tfHwodC5ybmd8fHIpKCk7aWYoc1s2XT0xNSZzWzZdfDY0LHNbOF09NjMmc1s4XXwxMjgsZSlmb3IodmFyIGE9MDthPDE2O2ErKyllW24rYV09c1thXTtyZXR1cm4gZXx8byhzKX12YXIgcixhPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp2b2lkIDAhPT1lP2U6bnVsbDtpZihhJiZhLmNyeXB0byYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyl7dmFyIGg9bmV3IFVpbnQ4QXJyYXkoMTYpO3I9ZnVuY3Rpb24oKXtyZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhoKSxofX1pZighcil7dmFyIGQ9bmV3IEFycmF5KDE2KTtyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9MDtlPDE2O2UrKykwPT0oMyZlKSYmKHQ9NDI5NDk2NzI5NipNYXRoLnJhbmRvbSgpKSxkW2VdPXQ+Pj4oKDMmZSk8PDMpJjI1NTtyZXR1cm4gZH19Zm9yKHZhciBsPVtdLHU9e30sYz0wO2M8MjU2O2MrKylsW2NdPShjKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSx1W2xbY11dPWM7dmFyIHA9cigpLGY9WzF8cFswXSxwWzFdLHBbMl0scFszXSxwWzRdLHBbNV1dLG09MTYzODMmKHBbNl08PDh8cFs3XSksdj0wLGc9MCx5PXM7eS52MT1uLHkudjQ9cyx5LnBhcnNlPWkseS51bnBhcnNlPW8sdC5leHBvcnRzPXl9KS5jYWxsKGUsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKSl9LGZ1bmN0aW9uKHQsZSxpKXtlLnV0aWw9aSgxKSxlLkRPTXV0aWw9aSg4OCksZS5EYXRhU2V0PWkoODkpLGUuRGF0YVZpZXc9aSg5MyksZS5RdWV1ZT1pKDkyKSxlLkdyYXBoM2Q9aSg5NCksZS5ncmFwaDNkPXtDYW1lcmE6aSgxMDIpLEZpbHRlcjppKDEwNyksUG9pbnQyZDppKDEwMSksUG9pbnQzZDppKDEwMCksU2xpZGVyOmkoMTA4KSxTdGVwTnVtYmVyOmkoMTA5KX0sZS5tb21lbnQ9aSg4MiksZS5IYW1tZXI9aSgxMTIpLGUua2V5Y2hhcm09aSgxMTUpfSxmdW5jdGlvbih0LGUpe2UucHJlcGFyZUVsZW1lbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0KXQuaGFzT3duUHJvcGVydHkoZSkmJih0W2VdLnJlZHVuZGFudD10W2VdLnVzZWQsdFtlXS51c2VkPVtdKX0sZS5jbGVhbnVwRWxlbWVudHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShlKSYmdFtlXS5yZWR1bmRhbnQpe2Zvcih2YXIgaT0wO2k8dFtlXS5yZWR1bmRhbnQubGVuZ3RoO2krKyl0W2VdLnJlZHVuZGFudFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRbZV0ucmVkdW5kYW50W2ldKTt0W2VdLnJlZHVuZGFudD1bXX19LGUucmVzZXRFbGVtZW50cz1mdW5jdGlvbih0KXtlLnByZXBhcmVFbGVtZW50cyh0KSxlLmNsZWFudXBFbGVtZW50cyh0KSxlLnByZXBhcmVFbGVtZW50cyh0KX0sZS5nZXRTVkdFbGVtZW50PWZ1bmN0aW9uKHQsZSxpKXt2YXIgbztyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSh0KT9lW3RdLnJlZHVuZGFudC5sZW5ndGg+MD8obz1lW3RdLnJlZHVuZGFudFswXSxlW3RdLnJlZHVuZGFudC5zaGlmdCgpKToobz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix0KSxpLmFwcGVuZENoaWxkKG8pKToobz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix0KSxlW3RdPXt1c2VkOltdLHJlZHVuZGFudDpbXX0saS5hcHBlbmRDaGlsZChvKSksZVt0XS51c2VkLnB1c2gobyksb30sZS5nZXRET01FbGVtZW50PWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuO3JldHVybiBlLmhhc093blByb3BlcnR5KHQpP2VbdF0ucmVkdW5kYW50Lmxlbmd0aD4wPyhuPWVbdF0ucmVkdW5kYW50WzBdLGVbdF0ucmVkdW5kYW50LnNoaWZ0KCkpOihuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCksdm9pZCAwIT09bz9pLmluc2VydEJlZm9yZShuLG8pOmkuYXBwZW5kQ2hpbGQobikpOihuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCksZVt0XT17dXNlZDpbXSxyZWR1bmRhbnQ6W119LHZvaWQgMCE9PW8/aS5pbnNlcnRCZWZvcmUobixvKTppLmFwcGVuZENoaWxkKG4pKSxlW3RdLnVzZWQucHVzaChuKSxufSxlLmRyYXdQb2ludD1mdW5jdGlvbih0LGksbyxuLHMscil7dmFyIGE7aWYoImNpcmNsZSI9PW8uc3R5bGU/KGE9ZS5nZXRTVkdFbGVtZW50KCJjaXJjbGUiLG4scyksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjeCIsdCksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjeSIsaSksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJyIiwuNSpvLnNpemUpKTooYT1lLmdldFNWR0VsZW1lbnQoInJlY3QiLG4scyksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ4Iix0LS41Km8uc2l6ZSksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IixpLS41Km8uc2l6ZSksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ3aWR0aCIsby5zaXplKSxhLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsby5zaXplKSksdm9pZCAwIT09by5zdHlsZXMmJmEuc2V0QXR0cmlidXRlTlMobnVsbCwic3R5bGUiLG8uc3R5bGVzKSxhLnNldEF0dHJpYnV0ZU5TKG51bGwsImNsYXNzIixvLmNsYXNzTmFtZSsiIHZpcy1wb2ludCIpLHIpe3ZhciBoPWUuZ2V0U1ZHRWxlbWVudCgidGV4dCIsbixzKTtyLnhPZmZzZXQmJih0Kz1yLnhPZmZzZXQpLHIueU9mZnNldCYmKGkrPXIueU9mZnNldCksci5jb250ZW50JiYoaC50ZXh0Q29udGVudD1yLmNvbnRlbnQpLHIuY2xhc3NOYW1lJiZoLnNldEF0dHJpYnV0ZU5TKG51bGwsImNsYXNzIixyLmNsYXNzTmFtZSsiIHZpcy1sYWJlbCIpLGguc2V0QXR0cmlidXRlTlMobnVsbCwieCIsdCksaC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IixpKX1yZXR1cm4gYX0sZS5kcmF3QmFyPWZ1bmN0aW9uKHQsaSxvLG4scyxyLGEsaCl7aWYoMCE9bil7bjwwJiYobio9LTEsaS09bik7dmFyIGQ9ZS5nZXRTVkdFbGVtZW50KCJyZWN0IixyLGEpO2Quc2V0QXR0cmlidXRlTlMobnVsbCwieCIsdC0uNSpvKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLGkpLGQuc2V0QXR0cmlidXRlTlMobnVsbCwid2lkdGgiLG8pLGQuc2V0QXR0cmlidXRlTlMobnVsbCwiaGVpZ2h0IixuKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsImNsYXNzIixzKSxoJiZkLnNldEF0dHJpYnV0ZU5TKG51bGwsInN0eWxlIixoKX19fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKHQmJiFBcnJheS5pc0FycmF5KHQpJiYoZT10LHQ9bnVsbCksdGhpcy5fb3B0aW9ucz1lfHx7fSx0aGlzLl9kYXRhPXt9LHRoaXMubGVuZ3RoPTAsdGhpcy5fZmllbGRJZD10aGlzLl9vcHRpb25zLmZpZWxkSWR8fCJpZCIsdGhpcy5fdHlwZT17fSx0aGlzLl9vcHRpb25zLnR5cGUpZm9yKHZhciBpPSgwLGwuZGVmYXVsdCkodGhpcy5fb3B0aW9ucy50eXBlKSxvPTAsbj1pLmxlbmd0aDtvPG47bysrKXt2YXIgcz1pW29dLHI9dGhpcy5fb3B0aW9ucy50eXBlW3NdO3RoaXMuX3R5cGVbc109IkRhdGUiPT1yfHwiSVNPRGF0ZSI9PXJ8fCJBU1BEYXRlIj09cj8iRGF0ZSI6cn1pZih0aGlzLl9vcHRpb25zLmNvbnZlcnQpdGhyb3cgbmV3IEVycm9yKCdPcHRpb24gImNvbnZlcnQiIGlzIGRlcHJlY2F0ZWQuIFVzZSAidHlwZSIgaW5zdGVhZC4nKTt0aGlzLl9zdWJzY3JpYmVycz17fSx0JiZ0aGlzLmFkZCh0KSx0aGlzLnNldE9wdGlvbnMoZSl9dmFyIHM9aSg5MCkscj1vKHMpLGE9aSg2MiksaD1vKGEpLGQ9aSg1OCksbD1vKGQpLHU9aSgxKSxjPWkoOTIpO24ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dCYmdm9pZCAwIT09dC5xdWV1ZSYmKCExPT09dC5xdWV1ZT90aGlzLl9xdWV1ZSYmKHRoaXMuX3F1ZXVlLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5fcXVldWUpOih0aGlzLl9xdWV1ZXx8KHRoaXMuX3F1ZXVlPWMuZXh0ZW5kKHRoaXMse3JlcGxhY2U6WyJhZGQiLCJ1cGRhdGUiLCJyZW1vdmUiXX0pKSwib2JqZWN0Ij09PSgwLGguZGVmYXVsdCkodC5xdWV1ZSkmJnRoaXMuX3F1ZXVlLnNldE9wdGlvbnModC5xdWV1ZSkpKX0sbi5wcm90b3R5cGUub249ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9zdWJzY3JpYmVyc1t0XTtpfHwoaT1bXSx0aGlzLl9zdWJzY3JpYmVyc1t0XT1pKSxpLnB1c2goe2NhbGxiYWNrOmV9KX0sbi5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJEYXRhU2V0LnN1YnNjcmliZSBpcyBkZXByZWNhdGVkLiBVc2UgRGF0YVNldC5vbiBpbnN0ZWFkLiIpfSxuLnByb3RvdHlwZS5vZmY9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9zdWJzY3JpYmVyc1t0XTtpJiYodGhpcy5fc3Vic2NyaWJlcnNbdF09aS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2FsbGJhY2shPWV9KSl9LG4ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJEYXRhU2V0LnVuc3Vic2NyaWJlIGlzIGRlcHJlY2F0ZWQuIFVzZSBEYXRhU2V0Lm9mZiBpbnN0ZWFkLiIpfSxuLnByb3RvdHlwZS5fdHJpZ2dlcj1mdW5jdGlvbih0LGUsaSl7aWYoIioiPT10KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHRyaWdnZXIgZXZlbnQgKiIpO3ZhciBvPVtdO3QgaW4gdGhpcy5fc3Vic2NyaWJlcnMmJihvPW8uY29uY2F0KHRoaXMuX3N1YnNjcmliZXJzW3RdKSksIioiaW4gdGhpcy5fc3Vic2NyaWJlcnMmJihvPW8uY29uY2F0KHRoaXMuX3N1YnNjcmliZXJzWyIqIl0pKTtmb3IodmFyIG49MCxzPW8ubGVuZ3RoO248cztuKyspe3ZhciByPW9bbl07ci5jYWxsYmFjayYmci5jYWxsYmFjayh0LGUsaXx8bnVsbCl9fSxuLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxvPVtdLG49dGhpcztpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgcz0wLHI9dC5sZW5ndGg7czxyO3MrKylpPW4uX2FkZEl0ZW0odFtzXSksby5wdXNoKGkpO2Vsc2V7aWYoIXR8fCJvYmplY3QiIT09KHZvaWQgMD09PXQ/InVuZGVmaW5lZCI6KDAsaC5kZWZhdWx0KSh0KSkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGRhdGFUeXBlIik7aT1uLl9hZGRJdGVtKHQpLG8ucHVzaChpKX1yZXR1cm4gby5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoImFkZCIse2l0ZW1zOm99LGUpLG99LG4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBpPVtdLG89W10sbj1bXSxzPVtdLHI9dGhpcyxhPXIuX2ZpZWxkSWQsZD1mdW5jdGlvbih0KXt2YXIgZT10W2FdO2lmKHIuX2RhdGFbZV0pe3ZhciBoPXUuZXh0ZW5kKHt9LHIuX2RhdGFbZV0pO2U9ci5fdXBkYXRlSXRlbSh0KSxvLnB1c2goZSkscy5wdXNoKHQpLG4ucHVzaChoKX1lbHNlIGU9ci5fYWRkSXRlbSh0KSxpLnB1c2goZSl9O2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBsPTAsYz10Lmxlbmd0aDtsPGM7bCsrKXRbbF0mJiJvYmplY3QiPT09KDAsaC5kZWZhdWx0KSh0W2xdKT9kKHRbbF0pOmNvbnNvbGUud2FybigiSWdub3JpbmcgaW5wdXQgaXRlbSwgd2hpY2ggaXMgbm90IGFuIG9iamVjdCBhdCBpbmRleCAiK2wpO2Vsc2V7aWYoIXR8fCJvYmplY3QiIT09KHZvaWQgMD09PXQ/InVuZGVmaW5lZCI6KDAsaC5kZWZhdWx0KSh0KSkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGRhdGFUeXBlIik7ZCh0KX1pZihpLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcigiYWRkIix7aXRlbXM6aX0sZSksby5sZW5ndGgpe3ZhciBwPXtpdGVtczpvLG9sZERhdGE6bixkYXRhOnN9O3RoaXMuX3RyaWdnZXIoInVwZGF0ZSIscCxlKX1yZXR1cm4gaS5jb25jYXQobyl9LG4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbj10aGlzLHM9dS5nZXRUeXBlKGFyZ3VtZW50c1swXSk7IlN0cmluZyI9PXN8fCJOdW1iZXIiPT1zPyhlPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSk6IkFycmF5Ij09cz8oaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0pOm89YXJndW1lbnRzWzBdO3ZhciByO2lmKG8mJm8ucmV0dXJuVHlwZSl7cj0tMT09WyJBcnJheSIsIk9iamVjdCJdLmluZGV4T2Yoby5yZXR1cm5UeXBlKT8iQXJyYXkiOm8ucmV0dXJuVHlwZX1lbHNlIHI9IkFycmF5Ijt2YXIgYSxoLGQsYyxwLGY9byYmby50eXBlfHx0aGlzLl9vcHRpb25zLnR5cGUsbT1vJiZvLmZpbHRlcix2PVtdO2lmKHZvaWQgMCE9ZSkoYT1uLl9nZXRJdGVtKGUsZikpJiZtJiYhbShhKSYmKGE9bnVsbCk7ZWxzZSBpZih2b2lkIDAhPWkpZm9yKGM9MCxwPWkubGVuZ3RoO2M8cDtjKyspYT1uLl9nZXRJdGVtKGlbY10sZiksbSYmIW0oYSl8fHYucHVzaChhKTtlbHNlIGZvcihoPSgwLGwuZGVmYXVsdCkodGhpcy5fZGF0YSksYz0wLHA9aC5sZW5ndGg7YzxwO2MrKylkPWhbY10sYT1uLl9nZXRJdGVtKGQsZiksbSYmIW0oYSl8fHYucHVzaChhKTtpZihvJiZvLm9yZGVyJiZ2b2lkIDA9PWUmJnRoaXMuX3NvcnQodixvLm9yZGVyKSxvJiZvLmZpZWxkcyl7dmFyIGc9by5maWVsZHM7aWYodm9pZCAwIT1lKWE9dGhpcy5fZmlsdGVyRmllbGRzKGEsZyk7ZWxzZSBmb3IoYz0wLHA9di5sZW5ndGg7YzxwO2MrKyl2W2NdPXRoaXMuX2ZpbHRlckZpZWxkcyh2W2NdLGcpfWlmKCJPYmplY3QiPT1yKXt2YXIgeSxiPXt9O2ZvcihjPTAscD12Lmxlbmd0aDtjPHA7YysrKXk9dltjXSxiW3kuaWRdPXk7cmV0dXJuIGJ9cmV0dXJuIHZvaWQgMCE9ZT9hOnZ9LG4ucHJvdG90eXBlLmdldElkcz1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbixzLHI9dGhpcy5fZGF0YSxhPXQmJnQuZmlsdGVyLGg9dCYmdC5vcmRlcixkPXQmJnQudHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLHU9KDAsbC5kZWZhdWx0KShyKSxjPVtdO2lmKGEpaWYoaCl7Zm9yKHM9W10sZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0sbj10aGlzLl9nZXRJdGVtKG8sZCksYShuKSYmcy5wdXNoKG4pO2Zvcih0aGlzLl9zb3J0KHMsaCksZT0wLGk9cy5sZW5ndGg7ZTxpO2UrKyljLnB1c2goc1tlXVt0aGlzLl9maWVsZElkXSl9ZWxzZSBmb3IoZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0sbj10aGlzLl9nZXRJdGVtKG8sZCksYShuKSYmYy5wdXNoKG5bdGhpcy5fZmllbGRJZF0pO2Vsc2UgaWYoaCl7Zm9yKHM9W10sZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0scy5wdXNoKHJbb10pO2Zvcih0aGlzLl9zb3J0KHMsaCksZT0wLGk9cy5sZW5ndGg7ZTxpO2UrKyljLnB1c2goc1tlXVt0aGlzLl9maWVsZElkXSl9ZWxzZSBmb3IoZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0sbj1yW29dLGMucHVzaChuW3RoaXMuX2ZpZWxkSWRdKTtyZXR1cm4gY30sbi5wcm90b3R5cGUuZ2V0RGF0YVNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxuLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscj1lJiZlLmZpbHRlcixhPWUmJmUudHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLGg9dGhpcy5fZGF0YSxkPSgwLGwuZGVmYXVsdCkoaCk7aWYoZSYmZS5vcmRlcil7dmFyIHU9dGhpcy5nZXQoZSk7Zm9yKGk9MCxvPXUubGVuZ3RoO2k8bztpKyspbj11W2ldLHM9blt0aGlzLl9maWVsZElkXSx0KG4scyl9ZWxzZSBmb3IoaT0wLG89ZC5sZW5ndGg7aTxvO2krKylzPWRbaV0sbj10aGlzLl9nZXRJdGVtKHMsYSksciYmIXIobil8fHQobixzKX0sbi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscj1lJiZlLmZpbHRlcixhPWUmJmUudHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLGg9W10sZD10aGlzLl9kYXRhLHU9KDAsbC5kZWZhdWx0KShkKTtmb3IoaT0wLG89dS5sZW5ndGg7aTxvO2krKyluPXVbaV0scz10aGlzLl9nZXRJdGVtKG4sYSksciYmIXIocyl8fGgucHVzaCh0KHMsbikpO3JldHVybiBlJiZlLm9yZGVyJiZ0aGlzLl9zb3J0KGgsZS5vcmRlciksaH0sbi5wcm90b3R5cGUuX2ZpbHRlckZpZWxkcz1mdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0O3ZhciBpLG8sbj17fSxzPSgwLGwuZGVmYXVsdCkodCkscj1zLmxlbmd0aDtpZihBcnJheS5pc0FycmF5KGUpKWZvcihpPTA7aTxyO2krKylvPXNbaV0sLTEhPWUuaW5kZXhPZihvKSYmKG5bb109dFtvXSk7ZWxzZSBmb3IoaT0wO2k8cjtpKyspbz1zW2ldLGUuaGFzT3duUHJvcGVydHkobykmJihuW2Vbb11dPXRbb10pO3JldHVybiBufSxuLnByb3RvdHlwZS5fc29ydD1mdW5jdGlvbih0LGUpe2lmKHUuaXNTdHJpbmcoZSkpe3ZhciBpPWU7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7dmFyIG89dFtpXSxuPWVbaV07cmV0dXJuIG8+bj8xOm88bj8tMTowfSl9ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPcmRlciBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmciKTt0LnNvcnQoZSl9fSxuLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCxlKXt2YXIgaSxvLG4scyxyPVtdLGE9W10saD1bXTtmb3IoaD1BcnJheS5pc0FycmF5KHQpP3Q6W3RdLGk9MCxvPWgubGVuZ3RoO2k8bztpKyspKHM9dGhpcy5fcmVtb3ZlKGhbaV0pKSYmdm9pZCAwIT0obj1zW3RoaXMuX2ZpZWxkSWRdKSYmKHIucHVzaChuKSxhLnB1c2gocykpO3JldHVybiByLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcigicmVtb3ZlIix7aXRlbXM6cixvbGREYXRhOmF9LGUpLHJ9LG4ucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGUsaTtyZXR1cm4gdS5pc051bWJlcih0KXx8dS5pc1N0cmluZyh0KT9pPXQ6dCYmIm9iamVjdCI9PT0odm9pZCAwPT09dD8idW5kZWZpbmVkIjooMCxoLmRlZmF1bHQpKHQpKSYmKGk9dFt0aGlzLl9maWVsZElkXSksdm9pZCAwIT09aSYmdGhpcy5fZGF0YVtpXT8oZT10aGlzLl9kYXRhW2ldLGRlbGV0ZSB0aGlzLl9kYXRhW2ldLHRoaXMubGVuZ3RoLS0sZSk6bnVsbH0sbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24odCl7dmFyIGUsaSxvPSgwLGwuZGVmYXVsdCkodGhpcy5fZGF0YSksbj1bXTtmb3IoZT0wLGk9by5sZW5ndGg7ZTxpO2UrKyluLnB1c2godGhpcy5fZGF0YVtvW2VdXSk7cmV0dXJuIHRoaXMuX2RhdGE9e30sdGhpcy5sZW5ndGg9MCx0aGlzLl90cmlnZ2VyKCJyZW1vdmUiLHtpdGVtczpvLG9sZERhdGE6bn0sdCksb30sbi5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKHQpe3ZhciBlLGksbz10aGlzLl9kYXRhLG49KDAsbC5kZWZhdWx0KShvKSxzPW51bGwscj1udWxsO2ZvcihlPTAsaT1uLmxlbmd0aDtlPGk7ZSsrKXt2YXIgYT1uW2VdLGg9b1thXSxkPWhbdF07bnVsbCE9ZCYmKCFzfHxkPnIpJiYocz1oLHI9ZCl9cmV0dXJuIHN9LG4ucHJvdG90eXBlLm1pbj1mdW5jdGlvbih0KXt2YXIgZSxpLG89dGhpcy5fZGF0YSxuPSgwLGwuZGVmYXVsdCkobykscz1udWxsLHI9bnVsbDtmb3IoZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyl7dmFyIGE9bltlXSxoPW9bYV0sZD1oW3RdO251bGwhPWQmJighc3x8ZDxyKSYmKHM9aCxyPWQpfXJldHVybiBzfSxuLnByb3RvdHlwZS5kaXN0aW5jdD1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbj10aGlzLl9kYXRhLHM9KDAsbC5kZWZhdWx0KShuKSxyPVtdLGE9dGhpcy5fb3B0aW9ucy50eXBlJiZ0aGlzLl9vcHRpb25zLnR5cGVbdF18fG51bGwsaD0wO2ZvcihlPTAsbz1zLmxlbmd0aDtlPG87ZSsrKXt2YXIgZD1zW2VdLGM9bltkXSxwPWNbdF0sZj0hMTtmb3IoaT0wO2k8aDtpKyspaWYocltpXT09cCl7Zj0hMDticmVha31mfHx2b2lkIDA9PT1wfHwocltoXT1wLGgrKyl9aWYoYSlmb3IoZT0wLG89ci5sZW5ndGg7ZTxvO2UrKylyW2VdPXUuY29udmVydChyW2VdLGEpO3JldHVybiByfSxuLnByb3RvdHlwZS5fYWRkSXRlbT1mdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuX2ZpZWxkSWRdO2lmKHZvaWQgMCE9ZSl7aWYodGhpcy5fZGF0YVtlXSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBhZGQgaXRlbTogaXRlbSB3aXRoIGlkICIrZSsiIGFscmVhZHkgZXhpc3RzIil9ZWxzZSBlPXUucmFuZG9tVVVJRCgpLHRbdGhpcy5fZmllbGRJZF09ZTt2YXIgaSxvLG49e30scz0oMCxsLmRlZmF1bHQpKHQpO2ZvcihpPTAsbz1zLmxlbmd0aDtpPG87aSsrKXt2YXIgcj1zW2ldLGE9dGhpcy5fdHlwZVtyXTtuW3JdPXUuY29udmVydCh0W3JdLGEpfXJldHVybiB0aGlzLl9kYXRhW2VdPW4sdGhpcy5sZW5ndGgrKyxlfSxuLnByb3RvdHlwZS5fZ2V0SXRlbT1mdW5jdGlvbih0LGUpe3ZhciBpLG8sbixzLHI9dGhpcy5fZGF0YVt0XTtpZighcilyZXR1cm4gbnVsbDt2YXIgYT17fSxoPSgwLGwuZGVmYXVsdCkocik7aWYoZSlmb3Iobj0wLHM9aC5sZW5ndGg7bjxzO24rKylpPWhbbl0sbz1yW2ldLGFbaV09dS5jb252ZXJ0KG8sZVtpXSk7ZWxzZSBmb3Iobj0wLHM9aC5sZW5ndGg7bjxzO24rKylpPWhbbl0sbz1yW2ldLGFbaV09bztyZXR1cm4gYVt0aGlzLl9maWVsZElkXXx8KGFbdGhpcy5fZmllbGRJZF09ci5pZCksYX0sbi5wcm90b3R5cGUuX3VwZGF0ZUl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLl9maWVsZElkXTtpZih2b2lkIDA9PWUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdXBkYXRlIGl0ZW06IGl0ZW0gaGFzIG5vIGlkIChpdGVtOiAiKygwLHIuZGVmYXVsdCkodCkrIikiKTt2YXIgaT10aGlzLl9kYXRhW2VdO2lmKCFpKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHVwZGF0ZSBpdGVtOiBubyBpdGVtIHdpdGggaWQgIitlKyIgZm91bmQiKTtmb3IodmFyIG89KDAsbC5kZWZhdWx0KSh0KSxuPTAscz1vLmxlbmd0aDtuPHM7bisrKXt2YXIgYT1vW25dLGg9dGhpcy5fdHlwZVthXTtpW2FdPXUuY29udmVydCh0W2FdLGgpfXJldHVybiBlfSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDkxKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTcpLG49by5KU09OfHwoby5KU09OPXtzdHJpbmdpZnk6SlNPTi5zdHJpbmdpZnl9KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uc3RyaW5naWZ5LmFwcGx5KG4sYXJndW1lbnRzKX19LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0KXt0aGlzLmRlbGF5PW51bGwsdGhpcy5tYXg9MS8wLHRoaXMuX3F1ZXVlPVtdLHRoaXMuX3RpbWVvdXQ9bnVsbCx0aGlzLl9leHRlbmRlZD1udWxsLHRoaXMuc2V0T3B0aW9ucyh0KX1pLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJnZvaWQgMCE9PXQuZGVsYXkmJih0aGlzLmRlbGF5PXQuZGVsYXkpLHQmJnZvaWQgMCE9PXQubWF4JiYodGhpcy5tYXg9dC5tYXgpLHRoaXMuX2ZsdXNoSWZOZWVkZWQoKX0saS5leHRlbmQ9ZnVuY3Rpb24odCxlKXt2YXIgbz1uZXcgaShlKTtpZih2b2lkIDAhPT10LmZsdXNoKXRocm93IG5ldyBFcnJvcigiVGFyZ2V0IG9iamVjdCBhbHJlYWR5IGhhcyBhIHByb3BlcnR5IGZsdXNoIik7dC5mbHVzaD1mdW5jdGlvbigpe28uZmx1c2goKX07dmFyIG49W3tuYW1lOiJmbHVzaCIsb3JpZ2luYWw6dm9pZCAwfV07aWYoZSYmZS5yZXBsYWNlKWZvcih2YXIgcz0wO3M8ZS5yZXBsYWNlLmxlbmd0aDtzKyspe3ZhciByPWUucmVwbGFjZVtzXTtuLnB1c2goe25hbWU6cixvcmlnaW5hbDp0W3JdfSksby5yZXBsYWNlKHQscil9cmV0dXJuIG8uX2V4dGVuZGVkPXtvYmplY3Q6dCxtZXRob2RzOm59LG99LGkucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZih0aGlzLmZsdXNoKCksdGhpcy5fZXh0ZW5kZWQpe2Zvcih2YXIgdD10aGlzLl9leHRlbmRlZC5vYmplY3QsZT10aGlzLl9leHRlbmRlZC5tZXRob2RzLGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLm9yaWdpbmFsP3Rbby5uYW1lXT1vLm9yaWdpbmFsOmRlbGV0ZSB0W28ubmFtZV19dGhpcy5fZXh0ZW5kZWQ9bnVsbH19LGkucHJvdG90eXBlLnJlcGxhY2U9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLG89dFtlXTtpZighbyl0aHJvdyBuZXcgRXJyb3IoIk1ldGhvZCAiK2UrIiB1bmRlZmluZWQiKTt0W2VdPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO2kucXVldWUoe2FyZ3M6dCxmbjpvLGNvbnRleHQ6dGhpc30pfX0saS5wcm90b3R5cGUucXVldWU9ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dGhpcy5fcXVldWUucHVzaCh7Zm46dH0pOnRoaXMuX3F1ZXVlLnB1c2godCksdGhpcy5fZmx1c2hJZk5lZWRlZCgpfSxpLnByb3RvdHlwZS5fZmx1c2hJZk5lZWRlZD1mdW5jdGlvbigpe2lmKHRoaXMuX3F1ZXVlLmxlbmd0aD50aGlzLm1heCYmdGhpcy5mbHVzaCgpLGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KSx0aGlzLnF1ZXVlLmxlbmd0aD4wJiYibnVtYmVyIj09dHlwZW9mIHRoaXMuZGVsYXkpe3ZhciB0PXRoaXM7dGhpcy5fdGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5mbHVzaCgpfSx0aGlzLmRlbGF5KX19LGkucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9xdWV1ZS5sZW5ndGg+MDspe3ZhciB0PXRoaXMuX3F1ZXVlLnNoaWZ0KCk7dC5mbi5hcHBseSh0LmNvbnRleHR8fHQuZm4sdC5hcmdzfHxbXSl9fSx0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLl9kYXRhPW51bGwsdGhpcy5faWRzPXt9LHRoaXMubGVuZ3RoPTAsdGhpcy5fb3B0aW9ucz1lfHx7fSx0aGlzLl9maWVsZElkPSJpZCIsdGhpcy5fc3Vic2NyaWJlcnM9e307dmFyIGk9dGhpczt0aGlzLmxpc3RlbmVyPWZ1bmN0aW9uKCl7aS5fb25FdmVudC5hcHBseShpLGFyZ3VtZW50cyl9LHRoaXMuc2V0RGF0YSh0KX12YXIgbj1pKDU4KSxzPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0obikscj1pKDEpLGE9aSg4OSk7by5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbixzO2lmKHRoaXMuX2RhdGEpe2Zvcih0aGlzLl9kYXRhLm9mZiYmdGhpcy5fZGF0YS5vZmYoIioiLHRoaXMubGlzdGVuZXIpLGU9dGhpcy5fZGF0YS5nZXRJZHMoe2ZpbHRlcjp0aGlzLl9vcHRpb25zJiZ0aGlzLl9vcHRpb25zLmZpbHRlcn0pLHM9W10sbz0wLG49ZS5sZW5ndGg7bzxuO28rKylzLnB1c2godGhpcy5fZGF0YS5fZGF0YVtlW29dXSk7dGhpcy5faWRzPXt9LHRoaXMubGVuZ3RoPTAsdGhpcy5fdHJpZ2dlcigicmVtb3ZlIix7aXRlbXM6ZSxvbGREYXRhOnN9KX1pZih0aGlzLl9kYXRhPXQsdGhpcy5fZGF0YSl7Zm9yKHRoaXMuX2ZpZWxkSWQ9dGhpcy5fb3B0aW9ucy5maWVsZElkfHx0aGlzLl9kYXRhJiZ0aGlzLl9kYXRhLm9wdGlvbnMmJnRoaXMuX2RhdGEub3B0aW9ucy5maWVsZElkfHwiaWQiLGU9dGhpcy5fZGF0YS5nZXRJZHMoe2ZpbHRlcjp0aGlzLl9vcHRpb25zJiZ0aGlzLl9vcHRpb25zLmZpbHRlcn0pLG89MCxuPWUubGVuZ3RoO288bjtvKyspaT1lW29dLHRoaXMuX2lkc1tpXT0hMDt0aGlzLmxlbmd0aD1lLmxlbmd0aCwKdGhpcy5fdHJpZ2dlcigiYWRkIix7aXRlbXM6ZX0pLHRoaXMuX2RhdGEub24mJnRoaXMuX2RhdGEub24oIioiLHRoaXMubGlzdGVuZXIpfX0sby5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbigpe3ZhciB0LGUsaSxvPXRoaXMuX2RhdGEuZ2V0SWRzKHtmaWx0ZXI6dGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5maWx0ZXJ9KSxuPSgwLHMuZGVmYXVsdCkodGhpcy5faWRzKSxyPXt9LGE9W10saD1bXSxkPVtdO2ZvcihlPTAsaT1vLmxlbmd0aDtlPGk7ZSsrKXQ9b1tlXSxyW3RdPSEwLHRoaXMuX2lkc1t0XXx8KGEucHVzaCh0KSx0aGlzLl9pZHNbdF09ITApO2ZvcihlPTAsaT1uLmxlbmd0aDtlPGk7ZSsrKXQ9bltlXSxyW3RdfHwoaC5wdXNoKHQpLGQucHVzaCh0aGlzLl9kYXRhLl9kYXRhW3RdKSxkZWxldGUgdGhpcy5faWRzW3RdKTt0aGlzLmxlbmd0aCs9YS5sZW5ndGgtaC5sZW5ndGgsYS5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoImFkZCIse2l0ZW1zOmF9KSxoLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcigicmVtb3ZlIix7aXRlbXM6aCxvbGREYXRhOmR9KX0sby5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlLGksbyxuPXRoaXMscz1yLmdldFR5cGUoYXJndW1lbnRzWzBdKTsiU3RyaW5nIj09c3x8Ik51bWJlciI9PXN8fCJBcnJheSI9PXM/KGU9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdKTooaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0pO3ZhciBhPXIuZXh0ZW5kKHt9LHRoaXMuX29wdGlvbnMsaSk7dGhpcy5fb3B0aW9ucy5maWx0ZXImJmkmJmkuZmlsdGVyJiYoYS5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG4uX29wdGlvbnMuZmlsdGVyKHQpJiZpLmZpbHRlcih0KX0pO3ZhciBoPVtdO3JldHVybiB2b2lkIDAhPWUmJmgucHVzaChlKSxoLnB1c2goYSksaC5wdXNoKG8pLHRoaXMuX2RhdGEmJnRoaXMuX2RhdGEuZ2V0LmFwcGx5KHRoaXMuX2RhdGEsaCl9LG8ucHJvdG90eXBlLmdldElkcz1mdW5jdGlvbih0KXt2YXIgZTtpZih0aGlzLl9kYXRhKXt2YXIgaSxvPXRoaXMuX29wdGlvbnMuZmlsdGVyO2k9dCYmdC5maWx0ZXI/bz9mdW5jdGlvbihlKXtyZXR1cm4gbyhlKSYmdC5maWx0ZXIoZSl9OnQuZmlsdGVyOm8sZT10aGlzLl9kYXRhLmdldElkcyh7ZmlsdGVyOmksb3JkZXI6dCYmdC5vcmRlcn0pfWVsc2UgZT1bXTtyZXR1cm4gZX0sby5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQsZSl7dmFyIGk9W107aWYodGhpcy5fZGF0YSl7dmFyIG8sbj10aGlzLl9vcHRpb25zLmZpbHRlcjtvPWUmJmUuZmlsdGVyP24/ZnVuY3Rpb24odCl7cmV0dXJuIG4odCkmJmUuZmlsdGVyKHQpfTplLmZpbHRlcjpuLGk9dGhpcy5fZGF0YS5tYXAodCx7ZmlsdGVyOm8sb3JkZXI6ZSYmZS5vcmRlcn0pfWVsc2UgaT1bXTtyZXR1cm4gaX0sby5wcm90b3R5cGUuZ2V0RGF0YVNldD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzO3QgaW5zdGFuY2VvZiBvOyl0PXQuX2RhdGE7cmV0dXJuIHR8fG51bGx9LG8ucHJvdG90eXBlLl9vbkV2ZW50PWZ1bmN0aW9uKHQsZSxpKXt2YXIgbyxuLHMscixhPWUmJmUuaXRlbXMsaD1bXSxkPVtdLGw9W10sdT1bXSxjPVtdLHA9W107aWYoYSYmdGhpcy5fZGF0YSl7c3dpdGNoKHQpe2Nhc2UiYWRkIjpmb3Iobz0wLG49YS5sZW5ndGg7bzxuO28rKylzPWFbb10sKHI9dGhpcy5nZXQocykpJiYodGhpcy5faWRzW3NdPSEwLGgucHVzaChzKSk7YnJlYWs7Y2FzZSJ1cGRhdGUiOmZvcihvPTAsbj1hLmxlbmd0aDtvPG47bysrKXM9YVtvXSxyPXRoaXMuZ2V0KHMpLHI/dGhpcy5faWRzW3NdPyhkLnB1c2gocyksYy5wdXNoKGUuZGF0YVtvXSksdS5wdXNoKGUub2xkRGF0YVtvXSkpOih0aGlzLl9pZHNbc109ITAsaC5wdXNoKHMpKTp0aGlzLl9pZHNbc10mJihkZWxldGUgdGhpcy5faWRzW3NdLGwucHVzaChzKSxwLnB1c2goZS5vbGREYXRhW29dKSk7YnJlYWs7Y2FzZSJyZW1vdmUiOmZvcihvPTAsbj1hLmxlbmd0aDtvPG47bysrKXM9YVtvXSx0aGlzLl9pZHNbc10mJihkZWxldGUgdGhpcy5faWRzW3NdLGwucHVzaChzKSxwLnB1c2goZS5vbGREYXRhW29dKSl9dGhpcy5sZW5ndGgrPWgubGVuZ3RoLWwubGVuZ3RoLGgubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyKCJhZGQiLHtpdGVtczpofSxpKSxkLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcigidXBkYXRlIix7aXRlbXM6ZCxvbGREYXRhOnUsZGF0YTpjfSxpKSxsLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcigicmVtb3ZlIix7aXRlbXM6bCxvbGREYXRhOnB9LGkpfX0sby5wcm90b3R5cGUub249YS5wcm90b3R5cGUub24sby5wcm90b3R5cGUub2ZmPWEucHJvdG90eXBlLm9mZixvLnByb3RvdHlwZS5fdHJpZ2dlcj1hLnByb3RvdHlwZS5fdHJpZ2dlcixvLnByb3RvdHlwZS5zdWJzY3JpYmU9by5wcm90b3R5cGUub24sby5wcm90b3R5cGUudW5zdWJzY3JpYmU9by5wcm90b3R5cGUub2ZmLHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgbykpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKTt0aGlzLmNvbnRhaW5lckVsZW1lbnQ9dCx0aGlzLmRhdGFUYWJsZT1udWxsLHRoaXMuZGF0YVBvaW50cz1udWxsLHRoaXMuY3JlYXRlKCkseS5zZXREZWZhdWx0cyhiLHRoaXMpLHRoaXMuY29sWD12b2lkIDAsdGhpcy5jb2xZPXZvaWQgMCx0aGlzLmNvbFo9dm9pZCAwLHRoaXMuY29sVmFsdWU9dm9pZCAwLHRoaXMuY29sRmlsdGVyPXZvaWQgMCx0aGlzLnNldE9wdGlvbnMoaSksZSYmdGhpcy5zZXREYXRhKGUpfWZ1bmN0aW9uIG4odCl7cmV0dXJuImNsaWVudFgiaW4gdD90LmNsaWVudFg6dC50YXJnZXRUb3VjaGVzWzBdJiZ0LnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WHx8MH1mdW5jdGlvbiBzKHQpe3JldHVybiJjbGllbnRZImluIHQ/dC5jbGllbnRZOnQudGFyZ2V0VG91Y2hlc1swXSYmdC50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFl8fDB9dmFyIHI9aSg5NSksYT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KHIpLGg9aSg5OSksZD1pKDg5KSxsPWkoOTMpLHU9aSgxKSxjPWkoMTAwKSxwPWkoMTAxKSxmPShpKDEwMiksaSgxMDcpKSxtPWkoMTA4KSx2PWkoMTA5KSxnPWkoMTEwKSx5PWkoMTExKTtvLlNUWUxFPXkuU1RZTEU7dmFyIGI9e3dpZHRoOiI0MDBweCIsaGVpZ2h0OiI0MDBweCIsZmlsdGVyTGFiZWw6InRpbWUiLGxlZ2VuZExhYmVsOiJ2YWx1ZSIseExhYmVsOiJ4Iix5TGFiZWw6InkiLHpMYWJlbDoieiIseFZhbHVlTGFiZWw6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHlWYWx1ZUxhYmVsOmZ1bmN0aW9uKHQpe3JldHVybiB0fSx6VmFsdWVMYWJlbDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sc2hvd1hBeGlzOiEwLHNob3dZQXhpczohMCxzaG93WkF4aXM6ITAsc2hvd0dyaWQ6ITAsc2hvd1BlcnNwZWN0aXZlOiEwLHNob3dTaGFkb3c6ITEsa2VlcEFzcGVjdFJhdGlvOiEwLHZlcnRpY2FsUmF0aW86LjUsZG90U2l6ZVJhdGlvOi4wMixkb3RTaXplTWluRnJhY3Rpb246LjUsZG90U2l6ZU1heEZyYWN0aW9uOjIuNSxzaG93QW5pbWF0aW9uQ29udHJvbHM6dm9pZCAwLGFuaW1hdGlvbkludGVydmFsOjFlMyxhbmltYXRpb25QcmVsb2FkOiExLGFuaW1hdGlvbkF1dG9TdGFydDp2b2lkIDAsYXhpc0NvbG9yOiIjNEQ0RDREIixncmlkQ29sb3I6IiNEM0QzRDMiLHhDZW50ZXI6IjU1JSIseUNlbnRlcjoiNTAlIixzdHlsZTpvLlNUWUxFLkRPVCx0b29sdGlwOiExLHRvb2x0aXBTdHlsZTp7Y29udGVudDp7cGFkZGluZzoiMTBweCIsYm9yZGVyOiIxcHggc29saWQgIzRkNGQ0ZCIsY29sb3I6IiMxYTFhMWEiLGJhY2tncm91bmQ6InJnYmEoMjU1LDI1NSwyNTUsMC43KSIsYm9yZGVyUmFkaXVzOiIycHgiLGJveFNoYWRvdzoiNXB4IDVweCAxMHB4IHJnYmEoMTI4LDEyOCwxMjgsMC41KSJ9LGxpbmU6e2hlaWdodDoiNDBweCIsd2lkdGg6IjAiLGJvcmRlckxlZnQ6IjFweCBzb2xpZCAjNGQ0ZDRkIn0sZG90OntoZWlnaHQ6IjAiLHdpZHRoOiIwIixib3JkZXI6IjVweCBzb2xpZCAjNGQ0ZDRkIixib3JkZXJSYWRpdXM6IjVweCJ9fSxzaG93TGVnZW5kOnZvaWQgMCxiYWNrZ3JvdW5kQ29sb3I6dm9pZCAwLGRhdGFDb2xvcjp7ZmlsbDoiIzdEQzFGRiIsc3Ryb2tlOiIjMzI2N0QyIixzdHJva2VXaWR0aDoxfSxjYW1lcmFQb3NpdGlvbjp7aG9yaXpvbnRhbDoxLHZlcnRpY2FsOi41LGRpc3RhbmNlOjEuN30seEJhcldpZHRoOnZvaWQgMCx5QmFyV2lkdGg6dm9pZCAwLHZhbHVlTWluOnZvaWQgMCx2YWx1ZU1heDp2b2lkIDAseE1pbjp2b2lkIDAseE1heDp2b2lkIDAseFN0ZXA6dm9pZCAwLHlNaW46dm9pZCAwLHlNYXg6dm9pZCAwLHlTdGVwOnZvaWQgMCx6TWluOnZvaWQgMCx6TWF4OnZvaWQgMCx6U3RlcDp2b2lkIDB9O2goby5wcm90b3R5cGUpLG8ucHJvdG90eXBlLl9zZXRTY2FsZT1mdW5jdGlvbigpe3RoaXMuc2NhbGU9bmV3IGMoMS90aGlzLnhSYW5nZS5yYW5nZSgpLDEvdGhpcy55UmFuZ2UucmFuZ2UoKSwxL3RoaXMuelJhbmdlLnJhbmdlKCkpLHRoaXMua2VlcEFzcGVjdFJhdGlvJiYodGhpcy5zY2FsZS54PHRoaXMuc2NhbGUueT90aGlzLnNjYWxlLnk9dGhpcy5zY2FsZS54OnRoaXMuc2NhbGUueD10aGlzLnNjYWxlLnkpLHRoaXMuc2NhbGUueio9dGhpcy52ZXJ0aWNhbFJhdGlvLHZvaWQgMCE9PXRoaXMudmFsdWVSYW5nZSYmKHRoaXMuc2NhbGUudmFsdWU9MS90aGlzLnZhbHVlUmFuZ2UucmFuZ2UoKSk7dmFyIHQ9dGhpcy54UmFuZ2UuY2VudGVyKCkqdGhpcy5zY2FsZS54LGU9dGhpcy55UmFuZ2UuY2VudGVyKCkqdGhpcy5zY2FsZS55LGk9dGhpcy56UmFuZ2UuY2VudGVyKCkqdGhpcy5zY2FsZS56O3RoaXMuY2FtZXJhLnNldEFybUxvY2F0aW9uKHQsZSxpKX0sby5wcm90b3R5cGUuX2NvbnZlcnQzRHRvMkQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY29udmVydFBvaW50VG9UcmFuc2xhdGlvbih0KTtyZXR1cm4gdGhpcy5fY29udmVydFRyYW5zbGF0aW9uVG9TY3JlZW4oZSl9LG8ucHJvdG90eXBlLl9jb252ZXJ0UG9pbnRUb1RyYW5zbGF0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2FtZXJhLmdldENhbWVyYUxvY2F0aW9uKCksaT10aGlzLmNhbWVyYS5nZXRDYW1lcmFSb3RhdGlvbigpLG89dC54KnRoaXMuc2NhbGUueCxuPXQueSp0aGlzLnNjYWxlLnkscz10LnoqdGhpcy5zY2FsZS56LHI9ZS54LGE9ZS55LGg9ZS56LGQ9TWF0aC5zaW4oaS54KSxsPU1hdGguY29zKGkueCksdT1NYXRoLnNpbihpLnkpLHA9TWF0aC5jb3MoaS55KSxmPU1hdGguc2luKGkueiksbT1NYXRoLmNvcyhpLnopO3JldHVybiBuZXcgYyhwKihmKihuLWEpK20qKG8tcikpLXUqKHMtaCksZCoocCoocy1oKSt1KihmKihuLWEpK20qKG8tcikpKStsKihtKihuLWEpLWYqKG8tcikpLGwqKHAqKHMtaCkrdSooZioobi1hKSttKihvLXIpKSktZCoobSoobi1hKS1mKihvLXIpKSl9LG8ucHJvdG90eXBlLl9jb252ZXJ0VHJhbnNsYXRpb25Ub1NjcmVlbj1mdW5jdGlvbih0KXt2YXIgZSxpLG89dGhpcy5leWUueCxuPXRoaXMuZXllLnkscz10aGlzLmV5ZS56LHI9dC54LGE9dC55LGg9dC56O3JldHVybiB0aGlzLnNob3dQZXJzcGVjdGl2ZT8oZT1zL2gqKHItbyksaT1zL2gqKGEtbikpOihlPXIqKC1zL3RoaXMuY2FtZXJhLmdldEFybUxlbmd0aCgpKSxpPWEqKC1zL3RoaXMuY2FtZXJhLmdldEFybUxlbmd0aCgpKSksbmV3IHAodGhpcy5jdXJyZW50WENlbnRlcitlKnRoaXMuZnJhbWUuY2FudmFzLmNsaWVudFdpZHRoLHRoaXMuY3VycmVudFlDZW50ZXItaSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCl9LG8ucHJvdG90eXBlLl9jYWxjVHJhbnNsYXRpb25zPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9ITApO2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbz10W2ldO28udHJhbnM9dGhpcy5fY29udmVydFBvaW50VG9UcmFuc2xhdGlvbihvLnBvaW50KSxvLnNjcmVlbj10aGlzLl9jb252ZXJ0VHJhbnNsYXRpb25Ub1NjcmVlbihvLnRyYW5zKTt2YXIgbj10aGlzLl9jb252ZXJ0UG9pbnRUb1RyYW5zbGF0aW9uKG8uYm90dG9tKTtvLmRpc3Q9dGhpcy5zaG93UGVyc3BlY3RpdmU/bi5sZW5ndGgoKTotbi56fWlmKGUpe3ZhciBzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZGlzdC10LmRpc3R9O3Quc29ydChzKX19LG8ucHJvdG90eXBlLmdldE51bWJlck9mUm93cz1mdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGh9LG8ucHJvdG90eXBlLmdldE51bWJlck9mQ29sdW1ucz1mdW5jdGlvbih0KXt2YXIgZT0wO2Zvcih2YXIgaSBpbiB0WzBdKXRbMF0uaGFzT3duUHJvcGVydHkoaSkmJmUrKztyZXR1cm4gZX0sby5wcm90b3R5cGUuZ2V0RGlzdGluY3RWYWx1ZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9W10sbz0wO288dC5sZW5ndGg7bysrKS0xPT1pLmluZGV4T2YodFtvXVtlXSkmJmkucHVzaCh0W29dW2VdKTtyZXR1cm4gaS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pfSxvLnByb3RvdHlwZS5nZXRTbWFsbGVzdERpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dGhpcy5nZXREaXN0aW5jdFZhbHVlcyh0LGUpLG89bnVsbCxuPTE7bjxpLmxlbmd0aDtuKyspe3ZhciBzPWlbbl0taVtuLTFdOyhudWxsPT1vfHxvPnMpJiYobz1zKX1yZXR1cm4gb30sby5wcm90b3R5cGUuZ2V0Q29sdW1uUmFuZ2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9bmV3IGcsbz0wO288dC5sZW5ndGg7bysrKXt2YXIgbj10W29dW2VdO2kuYWRqdXN0KG4pfXJldHVybiBpfSxvLnByb3RvdHlwZS5fY2hlY2tWYWx1ZUZpZWxkPWZ1bmN0aW9uKHQpe2lmKHRoaXMuc3R5bGU9PT1vLlNUWUxFLkJBUkNPTE9SfHx0aGlzLnN0eWxlPT09by5TVFlMRS5CQVJTSVpFfHx0aGlzLnN0eWxlPT09by5TVFlMRS5ET1RDT0xPUnx8dGhpcy5zdHlsZT09PW8uU1RZTEUuRE9UU0laRSl7aWYodm9pZCAwPT09dGhpcy5jb2xWYWx1ZSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGRhdGEgdG8gaGF2ZSAgZmllbGQgJ3N0eWxlJyAgZm9yIGdyYXBoIHN0eWxlICciK3RoaXMuc3R5bGUrIiciKTtpZih2b2lkIDA9PT10WzBdW3RoaXMuY29sVmFsdWVdKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgZGF0YSB0byBoYXZlICBmaWVsZCAnIit0aGlzLmNvbFZhbHVlKyInICBmb3IgZ3JhcGggc3R5bGUgJyIrdGhpcy5zdHlsZSsiJyIpfX0sby5wcm90b3R5cGUuX3NldFJhbmdlRGVmYXVsdHM9ZnVuY3Rpb24odCxlLGkpe3ZvaWQgMCE9PWUmJih0Lm1pbj1lKSx2b2lkIDAhPT1pJiYodC5tYXg9aSksdC5tYXg8PXQubWluJiYodC5tYXg9dC5taW4rMSl9LG8ucHJvdG90eXBlLl9kYXRhSW5pdGlhbGl6ZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXM7aWYodGhpcy5kYXRhU2V0JiZ0aGlzLmRhdGFTZXQub2ZmKCIqIix0aGlzLl9vbkNoYW5nZSksdm9pZCAwIT09dCl7QXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IGQodCkpO3ZhciBuO2lmKCEodCBpbnN0YW5jZW9mIGR8fHQgaW5zdGFuY2VvZiBsKSl0aHJvdyBuZXcgRXJyb3IoIkFycmF5LCBEYXRhU2V0LCBvciBEYXRhVmlldyBleHBlY3RlZCIpO2lmKG49dC5nZXQoKSwwIT1uLmxlbmd0aCl7dGhpcy5kYXRhU2V0PXQsdGhpcy5kYXRhVGFibGU9bix0aGlzLl9vbkNoYW5nZT1mdW5jdGlvbigpe2kuc2V0RGF0YShpLmRhdGFTZXQpfSx0aGlzLmRhdGFTZXQub24oIioiLHRoaXMuX29uQ2hhbmdlKSx0aGlzLmNvbFg9IngiLHRoaXMuY29sWT0ieSIsdGhpcy5jb2xaPSJ6Ijt2YXIgcz10aGlzLnN0eWxlPT1vLlNUWUxFLkJBUnx8dGhpcy5zdHlsZT09by5TVFlMRS5CQVJDT0xPUnx8dGhpcy5zdHlsZT09by5TVFlMRS5CQVJTSVpFO3MmJih2b2lkIDAhPT10aGlzLmRlZmF1bHRYQmFyV2lkdGg/dGhpcy54QmFyV2lkdGg9dGhpcy5kZWZhdWx0WEJhcldpZHRoOnRoaXMueEJhcldpZHRoPXRoaXMuZ2V0U21hbGxlc3REaWZmZXJlbmNlKG4sdGhpcy5jb2xYKXx8MSx2b2lkIDAhPT10aGlzLmRlZmF1bHRZQmFyV2lkdGg/dGhpcy55QmFyV2lkdGg9dGhpcy5kZWZhdWx0WUJhcldpZHRoOnRoaXMueUJhcldpZHRoPXRoaXMuZ2V0U21hbGxlc3REaWZmZXJlbmNlKG4sdGhpcy5jb2xZKXx8MSk7dmFyIHI9dGhpcy5nZXRDb2x1bW5SYW5nZShuLHRoaXMuY29sWCk7cyYmci5leHBhbmQodGhpcy54QmFyV2lkdGgvMiksdGhpcy5fc2V0UmFuZ2VEZWZhdWx0cyhyLHRoaXMuZGVmYXVsdFhNaW4sdGhpcy5kZWZhdWx0WE1heCksdGhpcy54UmFuZ2U9cix0aGlzLnhTdGVwPXZvaWQgMCE9PXRoaXMuZGVmYXVsdFhTdGVwP3RoaXMuZGVmYXVsdFhTdGVwOnIucmFuZ2UoKS81O3ZhciBhPXRoaXMuZ2V0Q29sdW1uUmFuZ2Uobix0aGlzLmNvbFkpO3MmJmEuZXhwYW5kKHRoaXMueUJhcldpZHRoLzIpLHRoaXMuX3NldFJhbmdlRGVmYXVsdHMoYSx0aGlzLmRlZmF1bHRZTWluLHRoaXMuZGVmYXVsdFlNYXgpLHRoaXMueVJhbmdlPWEsdGhpcy55U3RlcD12b2lkIDAhPT10aGlzLmRlZmF1bHRZU3RlcD90aGlzLmRlZmF1bHRZU3RlcDphLnJhbmdlKCkvNTt2YXIgaD10aGlzLmdldENvbHVtblJhbmdlKG4sdGhpcy5jb2xaKTtpZih0aGlzLl9zZXRSYW5nZURlZmF1bHRzKGgsdGhpcy5kZWZhdWx0Wk1pbix0aGlzLmRlZmF1bHRaTWF4KSx0aGlzLnpSYW5nZT1oLHRoaXMuelN0ZXA9dm9pZCAwIT09dGhpcy5kZWZhdWx0WlN0ZXA/dGhpcy5kZWZhdWx0WlN0ZXA6aC5yYW5nZSgpLzUsblswXS5oYXNPd25Qcm9wZXJ0eSgic3R5bGUiKSl7dGhpcy5jb2xWYWx1ZT0ic3R5bGUiO3ZhciB1PXRoaXMuZ2V0Q29sdW1uUmFuZ2Uobix0aGlzLmNvbFZhbHVlKTt0aGlzLl9zZXRSYW5nZURlZmF1bHRzKHUsdGhpcy5kZWZhdWx0VmFsdWVNaW4sdGhpcy5kZWZhdWx0VmFsdWVNYXgpLHRoaXMudmFsdWVSYW5nZT11fW5bMF0uaGFzT3duUHJvcGVydHkoImZpbHRlciIpJiYodGhpcy5jb2xGaWx0ZXI9ImZpbHRlciIsdm9pZCAwPT09dGhpcy5kYXRhRmlsdGVyJiYodGhpcy5kYXRhRmlsdGVyPW5ldyBmKHQsdGhpcy5jb2xGaWx0ZXIsdGhpcyksdGhpcy5kYXRhRmlsdGVyLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7aS5yZWRyYXcoKX0pKSksdGhpcy5fc2V0U2NhbGUoKX19fSxvLnByb3RvdHlwZS5fZ2V0RGF0YVBvaW50cz1mdW5jdGlvbih0KXt2YXIgZSxpLG4scyxyLGEsaD1bXTtpZih0aGlzLnN0eWxlPT09by5TVFlMRS5HUklEfHx0aGlzLnN0eWxlPT09by5TVFlMRS5TVVJGQUNFKXt2YXIgZD1bXSxsPVtdO2ZvcihuPTA7bjx0aGlzLmdldE51bWJlck9mUm93cyh0KTtuKyspZT10W25dW3RoaXMuY29sWF18fDAsaT10W25dW3RoaXMuY29sWV18fDAsLTE9PT1kLmluZGV4T2YoZSkmJmQucHVzaChlKSwtMT09PWwuaW5kZXhPZihpKSYmbC5wdXNoKGkpO3ZhciB1PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX07ZC5zb3J0KHUpLGwuc29ydCh1KTt2YXIgcD1bXTtmb3Iobj0wO248dC5sZW5ndGg7bisrKXtlPXRbbl1bdGhpcy5jb2xYXXx8MCxpPXRbbl1bdGhpcy5jb2xZXXx8MCxzPXRbbl1bdGhpcy5jb2xaXXx8MDt2YXIgZj1kLmluZGV4T2YoZSksbT1sLmluZGV4T2YoaSk7dm9pZCAwPT09cFtmXSYmKHBbZl09W10pO3ZhciB2PW5ldyBjO3YueD1lLHYueT1pLHYuej1zLHYuZGF0YT10W25dLHI9e30sci5wb2ludD12LHIudHJhbnM9dm9pZCAwLHIuc2NyZWVuPXZvaWQgMCxyLmJvdHRvbT1uZXcgYyhlLGksdGhpcy56UmFuZ2UubWluKSxwW2ZdW21dPXIsaC5wdXNoKHIpfWZvcihlPTA7ZTxwLmxlbmd0aDtlKyspZm9yKGk9MDtpPHBbZV0ubGVuZ3RoO2krKylwW2VdW2ldJiYocFtlXVtpXS5wb2ludFJpZ2h0PWU8cC5sZW5ndGgtMT9wW2UrMV1baV06dm9pZCAwLHBbZV1baV0ucG9pbnRUb3A9aTxwW2VdLmxlbmd0aC0xP3BbZV1baSsxXTp2b2lkIDAscFtlXVtpXS5wb2ludENyb3NzPWU8cC5sZW5ndGgtMSYmaTxwW2VdLmxlbmd0aC0xP3BbZSsxXVtpKzFdOnZvaWQgMCl9ZWxzZSBmb3IodGhpcy5fY2hlY2tWYWx1ZUZpZWxkKHQpLG49MDtuPHQubGVuZ3RoO24rKylhPW5ldyBjLGEueD10W25dW3RoaXMuY29sWF18fDAsYS55PXRbbl1bdGhpcy5jb2xZXXx8MCxhLno9dFtuXVt0aGlzLmNvbFpdfHwwLGEuZGF0YT10W25dLHZvaWQgMCE9PXRoaXMuY29sVmFsdWUmJihhLnZhbHVlPXRbbl1bdGhpcy5jb2xWYWx1ZV18fDApLHI9e30sci5wb2ludD1hLHIuYm90dG9tPW5ldyBjKGEueCxhLnksdGhpcy56UmFuZ2UubWluKSxyLnRyYW5zPXZvaWQgMCxyLnNjcmVlbj12b2lkIDAsdGhpcy5zdHlsZT09PW8uU1RZTEUuTElORSYmbj4wJiYoaFtuLTFdLnBvaW50TmV4dD1yKSxoLnB1c2gocik7cmV0dXJuIGh9LG8ucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbigpe2Zvcig7dGhpcy5jb250YWluZXJFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKTspdGhpcy5jb250YWluZXJFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyRWxlbWVudC5maXJzdENoaWxkKTt0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZnJhbWUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLmZyYW1lLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLHRoaXMuZnJhbWUuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLHRoaXMuZnJhbWUuY2FudmFzLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lLmNhbnZhcyk7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7dC5zdHlsZS5jb2xvcj0icmVkIix0LnN0eWxlLmZvbnRXZWlnaHQ9ImJvbGQiLHQuc3R5bGUucGFkZGluZz0iMTBweCIsdC5pbm5lckhUTUw9IkVycm9yOiB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBIVE1MIGNhbnZhcyIsdGhpcy5mcmFtZS5jYW52YXMuYXBwZW5kQ2hpbGQodCksdGhpcy5mcmFtZS5maWx0ZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5mcmFtZS5maWx0ZXIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmZyYW1lLmZpbHRlci5zdHlsZS5ib3R0b209IjBweCIsdGhpcy5mcmFtZS5maWx0ZXIuc3R5bGUubGVmdD0iMHB4Iix0aGlzLmZyYW1lLmZpbHRlci5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lLmZpbHRlcik7dmFyIGU9dGhpcyxpPWZ1bmN0aW9uKHQpe2UuX29uTW91c2VEb3duKHQpfSxvPWZ1bmN0aW9uKHQpe2UuX29uVG91Y2hTdGFydCh0KX0sbj1mdW5jdGlvbih0KXtlLl9vbldoZWVsKHQpfSxzPWZ1bmN0aW9uKHQpe2UuX29uVG9vbHRpcCh0KX0scj1mdW5jdGlvbih0KXtlLl9vbkNsaWNrKHQpfTt1LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5mcmFtZS5jYW52YXMsIm1vdXNlZG93biIsaSksdS5hZGRFdmVudExpc3RlbmVyKHRoaXMuZnJhbWUuY2FudmFzLCJ0b3VjaHN0YXJ0IixvKSx1LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5mcmFtZS5jYW52YXMsIm1vdXNld2hlZWwiLG4pLHUuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmZyYW1lLmNhbnZhcywibW91c2Vtb3ZlIixzKSx1LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5mcmFtZS5jYW52YXMsImNsaWNrIixyKSx0aGlzLmNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSl9LG8ucHJvdG90eXBlLl9zZXRTaXplPWZ1bmN0aW9uKHQsZSl7dGhpcy5mcmFtZS5zdHlsZS53aWR0aD10LHRoaXMuZnJhbWUuc3R5bGUuaGVpZ2h0PWUsdGhpcy5fcmVzaXplQ2FudmFzKCl9LG8ucHJvdG90eXBlLl9yZXNpemVDYW52YXM9ZnVuY3Rpb24oKXt0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5mcmFtZS5jYW52YXMuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLmZyYW1lLmNhbnZhcy53aWR0aD10aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx0aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQ9dGhpcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0LHRoaXMuZnJhbWUuZmlsdGVyLnN0eWxlLndpZHRoPXRoaXMuZnJhbWUuY2FudmFzLmNsaWVudFdpZHRoLTIwKyJweCJ9LG8ucHJvdG90eXBlLmFuaW1hdGlvblN0YXJ0PWZ1bmN0aW9uKCl7aWYoIXRoaXMuZnJhbWUuZmlsdGVyfHwhdGhpcy5mcmFtZS5maWx0ZXIuc2xpZGVyKXRocm93IG5ldyBFcnJvcigiTm8gYW5pbWF0aW9uIGF2YWlsYWJsZSIpO3RoaXMuZnJhbWUuZmlsdGVyLnNsaWRlci5wbGF5KCl9LG8ucHJvdG90eXBlLmFuaW1hdGlvblN0b3A9ZnVuY3Rpb24oKXt0aGlzLmZyYW1lLmZpbHRlciYmdGhpcy5mcmFtZS5maWx0ZXIuc2xpZGVyJiZ0aGlzLmZyYW1lLmZpbHRlci5zbGlkZXIuc3RvcCgpfSxvLnByb3RvdHlwZS5fcmVzaXplQ2VudGVyPWZ1bmN0aW9uKCl7IiUiPT09dGhpcy54Q2VudGVyLmNoYXJBdCh0aGlzLnhDZW50ZXIubGVuZ3RoLTEpP3RoaXMuY3VycmVudFhDZW50ZXI9cGFyc2VGbG9hdCh0aGlzLnhDZW50ZXIpLzEwMCp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aDp0aGlzLmN1cnJlbnRYQ2VudGVyPXBhcnNlRmxvYXQodGhpcy54Q2VudGVyKSwiJSI9PT10aGlzLnlDZW50ZXIuY2hhckF0KHRoaXMueUNlbnRlci5sZW5ndGgtMSk/dGhpcy5jdXJyZW50WUNlbnRlcj1wYXJzZUZsb2F0KHRoaXMueUNlbnRlcikvMTAwKih0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQtdGhpcy5mcmFtZS5maWx0ZXIuY2xpZW50SGVpZ2h0KTp0aGlzLmN1cnJlbnRZQ2VudGVyPXBhcnNlRmxvYXQodGhpcy55Q2VudGVyKX0sby5wcm90b3R5cGUuZ2V0Q2FtZXJhUG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNhbWVyYS5nZXRBcm1Sb3RhdGlvbigpO3JldHVybiB0LmRpc3RhbmNlPXRoaXMuY2FtZXJhLmdldEFybUxlbmd0aCgpLHR9LG8ucHJvdG90eXBlLl9yZWFkRGF0YT1mdW5jdGlvbih0KXt0aGlzLl9kYXRhSW5pdGlhbGl6ZSh0LHRoaXMuc3R5bGUpLHRoaXMuZGF0YUZpbHRlcj90aGlzLmRhdGFQb2ludHM9dGhpcy5kYXRhRmlsdGVyLl9nZXREYXRhUG9pbnRzKCk6dGhpcy5kYXRhUG9pbnRzPXRoaXMuX2dldERhdGFQb2ludHModGhpcy5kYXRhVGFibGUpLHRoaXMuX3JlZHJhd0ZpbHRlcigpfSxvLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX3JlYWREYXRhKHQpLHRoaXMucmVkcmF3KCksdGhpcy5hbmltYXRpb25BdXRvU3RhcnQmJnRoaXMuZGF0YUZpbHRlciYmdGhpcy5hbmltYXRpb25TdGFydCgpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3RoaXMuYW5pbWF0aW9uU3RvcCgpLHkuc2V0T3B0aW9ucyh0LHRoaXMpLHRoaXMuc2V0UG9pbnREcmF3aW5nTWV0aG9kKCksdGhpcy5fc2V0U2l6ZSh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLmRhdGFUYWJsZSYmdGhpcy5zZXREYXRhKHRoaXMuZGF0YVRhYmxlKSx0aGlzLmFuaW1hdGlvbkF1dG9TdGFydCYmdGhpcy5kYXRhRmlsdGVyJiZ0aGlzLmFuaW1hdGlvblN0YXJ0KCl9LG8ucHJvdG90eXBlLnNldFBvaW50RHJhd2luZ01ldGhvZD1mdW5jdGlvbigpe3ZhciB0PXZvaWQgMDtzd2l0Y2godGhpcy5zdHlsZSl7Y2FzZSBvLlNUWUxFLkJBUjp0PW8ucHJvdG90eXBlLl9yZWRyYXdCYXJHcmFwaFBvaW50O2JyZWFrO2Nhc2Ugby5TVFlMRS5CQVJDT0xPUjp0PW8ucHJvdG90eXBlLl9yZWRyYXdCYXJDb2xvckdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkJBUlNJWkU6dD1vLnByb3RvdHlwZS5fcmVkcmF3QmFyU2l6ZUdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkRPVDp0PW8ucHJvdG90eXBlLl9yZWRyYXdEb3RHcmFwaFBvaW50O2JyZWFrO2Nhc2Ugby5TVFlMRS5ET1RMSU5FOnQ9by5wcm90b3R5cGUuX3JlZHJhd0RvdExpbmVHcmFwaFBvaW50O2JyZWFrO2Nhc2Ugby5TVFlMRS5ET1RDT0xPUjp0PW8ucHJvdG90eXBlLl9yZWRyYXdEb3RDb2xvckdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkRPVFNJWkU6dD1vLnByb3RvdHlwZS5fcmVkcmF3RG90U2l6ZUdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLlNVUkZBQ0U6dD1vLnByb3RvdHlwZS5fcmVkcmF3U3VyZmFjZUdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkdSSUQ6dD1vLnByb3RvdHlwZS5fcmVkcmF3R3JpZEdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkxJTkU6dD1vLnByb3RvdHlwZS5fcmVkcmF3TGluZUdyYXBoUG9pbnQ7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgZGV0ZXJtaW5lIHBvaW50IGRyYXdpbmcgbWV0aG9kIGZvciBncmFwaCBzdHlsZSAnIit0aGlzLnN0eWxlKyInIil9dGhpcy5fcG9pbnREcmF3aW5nTWV0aG9kPXR9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMuZGF0YVBvaW50cyl0aHJvdyBuZXcgRXJyb3IoIkdyYXBoIGRhdGEgbm90IGluaXRpYWxpemVkIik7dGhpcy5fcmVzaXplQ2FudmFzKCksdGhpcy5fcmVzaXplQ2VudGVyKCksdGhpcy5fcmVkcmF3U2xpZGVyKCksdGhpcy5fcmVkcmF3Q2xlYXIoKSx0aGlzLl9yZWRyYXdBeGlzKCksdGhpcy5fcmVkcmF3RGF0YUdyYXBoKCksdGhpcy5fcmVkcmF3SW5mbygpLHRoaXMuX3JlZHJhd0xlZ2VuZCgpfSxvLnByb3RvdHlwZS5fZ2V0Q29udGV4dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZnJhbWUuY2FudmFzLGU9dC5nZXRDb250ZXh0KCIyZCIpO3JldHVybiBlLmxpbmVKb2luPSJyb3VuZCIsZS5saW5lQ2FwPSJyb3VuZCIsZX0sby5wcm90b3R5cGUuX3JlZHJhd0NsZWFyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mcmFtZS5jYW52YXM7dC5nZXRDb250ZXh0KCIyZCIpLmNsZWFyUmVjdCgwLDAsdC53aWR0aCx0LmhlaWdodCl9LG8ucHJvdG90eXBlLl9kb3RTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJhbWUuY2xpZW50V2lkdGgqdGhpcy5kb3RTaXplUmF0aW99LG8ucHJvdG90eXBlLl9nZXRMZWdlbmRXaWR0aD1mdW5jdGlvbigpe3ZhciB0O2lmKHRoaXMuc3R5bGU9PT1vLlNUWUxFLkRPVFNJWkUpe3Q9dGhpcy5fZG90U2l6ZSgpKnRoaXMuZG90U2l6ZU1heEZyYWN0aW9ufWVsc2UgdD10aGlzLnN0eWxlPT09by5TVFlMRS5CQVJTSVpFP3RoaXMueEJhcldpZHRoOjIwO3JldHVybiB0fSxvLnByb3RvdHlwZS5fcmVkcmF3TGVnZW5kPWZ1bmN0aW9uKCl7aWYoITA9PT10aGlzLnNob3dMZWdlbmQmJnRoaXMuc3R5bGUhPT1vLlNUWUxFLkxJTkUmJnRoaXMuc3R5bGUhPT1vLlNUWUxFLkJBUlNJWkUpe3ZhciB0PXRoaXMuc3R5bGU9PT1vLlNUWUxFLkJBUlNJWkV8fHRoaXMuc3R5bGU9PT1vLlNUWUxFLkRPVFNJWkUsZT10aGlzLnN0eWxlPT09by5TVFlMRS5ET1RTSVpFfHx0aGlzLnN0eWxlPT09by5TVFlMRS5ET1RDT0xPUnx8dGhpcy5zdHlsZT09PW8uU1RZTEUuQkFSQ09MT1IsaT1NYXRoLm1heCguMjUqdGhpcy5mcmFtZS5jbGllbnRIZWlnaHQsMTAwKSxuPXRoaXMubWFyZ2luLHM9dGhpcy5fZ2V0TGVnZW5kV2lkdGgoKSxyPXRoaXMuZnJhbWUuY2xpZW50V2lkdGgtdGhpcy5tYXJnaW4sYT1yLXMsaD1uK2ksZD10aGlzLl9nZXRDb250ZXh0KCk7aWYoZC5saW5lV2lkdGg9MSxkLmZvbnQ9IjE0cHggYXJpYWwiLCExPT09dCl7dmFyIGwsdT1pO2ZvcihsPTA7bDx1O2wrKyl7dmFyIGM9KGwtMCkvKHUtMCksZj0yNDAqYyxtPXRoaXMuX2hzdjJyZ2IoZiwxLDEpO2Quc3Ryb2tlU3R5bGU9bSxkLmJlZ2luUGF0aCgpLGQubW92ZVRvKGEsbitsKSxkLmxpbmVUbyhyLG4rbCksZC5zdHJva2UoKX1kLnN0cm9rZVN0eWxlPXRoaXMuYXhpc0NvbG9yLGQuc3Ryb2tlUmVjdChhLG4scyxpKX1lbHNle3ZhciBnO3RoaXMuc3R5bGU9PT1vLlNUWUxFLkRPVFNJWkU/Zz1zKih0aGlzLmRvdFNpemVNaW5GcmFjdGlvbi90aGlzLmRvdFNpemVNYXhGcmFjdGlvbik6KHRoaXMuc3R5bGUsby5TVFlMRS5CQVJTSVpFKSxkLnN0cm9rZVN0eWxlPXRoaXMuYXhpc0NvbG9yLGQuZmlsbFN0eWxlPXRoaXMuZGF0YUNvbG9yLmZpbGwsZC5iZWdpblBhdGgoKSxkLm1vdmVUbyhhLG4pLGQubGluZVRvKHIsbiksZC5saW5lVG8oYStnLGgpLGQubGluZVRvKGEsaCksZC5jbG9zZVBhdGgoKSxkLmZpbGwoKSxkLnN0cm9rZSgpfXZhciB5PWU/dGhpcy52YWx1ZVJhbmdlLm1pbjp0aGlzLnpSYW5nZS5taW4sYj1lP3RoaXMudmFsdWVSYW5nZS5tYXg6dGhpcy56UmFuZ2UubWF4LF89bmV3IHYoeSxiLChiLXkpLzUsITApO18uc3RhcnQoITApO2Zvcih2YXIgbCx3LHg7IV8uZW5kKCk7KWw9aC0oXy5nZXRDdXJyZW50KCkteSkvKGIteSkqaSx3PW5ldyBwKGEtNSxsKSx4PW5ldyBwKGEsbCksdGhpcy5fbGluZShkLHcseCksZC50ZXh0QWxpZ249InJpZ2h0IixkLnRleHRCYXNlbGluZT0ibWlkZGxlIixkLmZpbGxTdHlsZT10aGlzLmF4aXNDb2xvcixkLmZpbGxUZXh0KF8uZ2V0Q3VycmVudCgpLGEtMTAsbCksXy5uZXh0KCk7ZC50ZXh0QWxpZ249InJpZ2h0IixkLnRleHRCYXNlbGluZT0idG9wIjt2YXIgaz10aGlzLmxlZ2VuZExhYmVsO2QuZmlsbFRleHQoayxyLGgrdGhpcy5tYXJnaW4pfX0sby5wcm90b3R5cGUuX3JlZHJhd0ZpbHRlcj1mdW5jdGlvbigpe2lmKHRoaXMuZnJhbWUuZmlsdGVyLmlubmVySFRNTD0iIix0aGlzLmRhdGFGaWx0ZXIpe3ZhciB0PXt2aXNpYmxlOnRoaXMuc2hvd0FuaW1hdGlvbkNvbnRyb2xzfSxlPW5ldyBtKHRoaXMuZnJhbWUuZmlsdGVyLHQpO3RoaXMuZnJhbWUuZmlsdGVyLnNsaWRlcj1lLHRoaXMuZnJhbWUuZmlsdGVyLnN0eWxlLnBhZGRpbmc9IjEwcHgiLGUuc2V0VmFsdWVzKHRoaXMuZGF0YUZpbHRlci52YWx1ZXMpLGUuc2V0UGxheUludGVydmFsKHRoaXMuYW5pbWF0aW9uSW50ZXJ2YWwpO3ZhciBpPXRoaXMsbz1mdW5jdGlvbigpe3ZhciB0PWUuZ2V0SW5kZXgoKTtpLmRhdGFGaWx0ZXIuc2VsZWN0VmFsdWUodCksaS5kYXRhUG9pbnRzPWkuZGF0YUZpbHRlci5fZ2V0RGF0YVBvaW50cygpLGkucmVkcmF3KCl9O2Uuc2V0T25DaGFuZ2VDYWxsYmFjayhvKX1lbHNlIHRoaXMuZnJhbWUuZmlsdGVyLnNsaWRlcj12b2lkIDB9LG8ucHJvdG90eXBlLl9yZWRyYXdTbGlkZXI9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLmZyYW1lLmZpbHRlci5zbGlkZXImJnRoaXMuZnJhbWUuZmlsdGVyLnNsaWRlci5yZWRyYXcoKX0sby5wcm90b3R5cGUuX3JlZHJhd0luZm89ZnVuY3Rpb24oKXtpZih0aGlzLmRhdGFGaWx0ZXIpe3ZhciB0PXRoaXMuX2dldENvbnRleHQoKTt0LmZvbnQ9IjE0cHggYXJpYWwiLHQubGluZVN0eWxlPSJncmF5Iix0LmZpbGxTdHlsZT0iZ3JheSIsdC50ZXh0QWxpZ249ImxlZnQiLHQudGV4dEJhc2VsaW5lPSJ0b3AiO3ZhciBlPXRoaXMubWFyZ2luLGk9dGhpcy5tYXJnaW47dC5maWxsVGV4dCh0aGlzLmRhdGFGaWx0ZXIuZ2V0TGFiZWwoKSsiOiAiK3RoaXMuZGF0YUZpbHRlci5nZXRTZWxlY3RlZFZhbHVlKCksZSxpKX19LG8ucHJvdG90eXBlLl9saW5lPWZ1bmN0aW9uKHQsZSxpLG8pe3ZvaWQgMCE9PW8mJih0LnN0cm9rZVN0eWxlPW8pLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oZS54LGUueSksdC5saW5lVG8oaS54LGkueSksdC5zdHJva2UoKX0sby5wcm90b3R5cGUuZHJhd0F4aXNMYWJlbFg9ZnVuY3Rpb24odCxlLGksbyxuKXt2b2lkIDA9PT1uJiYobj0wKTt2YXIgcz10aGlzLl9jb252ZXJ0M0R0bzJEKGUpO01hdGguY29zKDIqbyk+MD8odC50ZXh0QWxpZ249ImNlbnRlciIsdC50ZXh0QmFzZWxpbmU9InRvcCIscy55Kz1uKTpNYXRoLnNpbigyKm8pPDA/KHQudGV4dEFsaWduPSJyaWdodCIsdC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIpOih0LnRleHRBbGlnbj0ibGVmdCIsdC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIpLHQuZmlsbFN0eWxlPXRoaXMuYXhpc0NvbG9yLHQuZmlsbFRleHQoaSxzLngscy55KX0sby5wcm90b3R5cGUuZHJhd0F4aXNMYWJlbFk9ZnVuY3Rpb24odCxlLGksbyxuKXt2b2lkIDA9PT1uJiYobj0wKTt2YXIgcz10aGlzLl9jb252ZXJ0M0R0bzJEKGUpO01hdGguY29zKDIqbyk8MD8odC50ZXh0QWxpZ249ImNlbnRlciIsdC50ZXh0QmFzZWxpbmU9InRvcCIscy55Kz1uKTpNYXRoLnNpbigyKm8pPjA/KHQudGV4dEFsaWduPSJyaWdodCIsdC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIpOih0LnRleHRBbGlnbj0ibGVmdCIsdC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIpLHQuZmlsbFN0eWxlPXRoaXMuYXhpc0NvbG9yLHQuZmlsbFRleHQoaSxzLngscy55KX0sby5wcm90b3R5cGUuZHJhd0F4aXNMYWJlbFo9ZnVuY3Rpb24odCxlLGksbyl7dm9pZCAwPT09byYmKG89MCk7dmFyIG49dGhpcy5fY29udmVydDNEdG8yRChlKTt0LnRleHRBbGlnbj0icmlnaHQiLHQudGV4dEJhc2VsaW5lPSJtaWRkbGUiLHQuZmlsbFN0eWxlPXRoaXMuYXhpc0NvbG9yLHQuZmlsbFRleHQoaSxuLngtbyxuLnkpfSxvLnByb3RvdHlwZS5fbGluZTNkPWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPXRoaXMuX2NvbnZlcnQzRHRvMkQoZSkscz10aGlzLl9jb252ZXJ0M0R0bzJEKGkpO3RoaXMuX2xpbmUodCxuLHMsbyl9LG8ucHJvdG90eXBlLl9yZWRyYXdBeGlzPWZ1bmN0aW9uKCl7dmFyIHQsZSxpLG8sbixzLHIsYSxoLGQsbCx1PXRoaXMuX2dldENvbnRleHQoKTt1LmZvbnQ9MjQvdGhpcy5jYW1lcmEuZ2V0QXJtTGVuZ3RoKCkrInB4IGFyaWFsIjt2YXIgZj0uMDI1L3RoaXMuc2NhbGUueCxtPS4wMjUvdGhpcy5zY2FsZS55LGc9NS90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSx5PXRoaXMuY2FtZXJhLmdldEFybVJvdGF0aW9uKCkuaG9yaXpvbnRhbCxiPW5ldyBwKE1hdGguY29zKHkpLE1hdGguc2luKHkpKSxfPXRoaXMueFJhbmdlLHc9dGhpcy55UmFuZ2UseD10aGlzLnpSYW5nZTtmb3IodS5saW5lV2lkdGg9MSxvPXZvaWQgMD09PXRoaXMuZGVmYXVsdFhTdGVwLGk9bmV3IHYoXy5taW4sXy5tYXgsdGhpcy54U3RlcCxvKSxpLnN0YXJ0KCEwKTshaS5lbmQoKTspe3ZhciBrPWkuZ2V0Q3VycmVudCgpO2lmKHRoaXMuc2hvd0dyaWQ/KHQ9bmV3IGMoayx3Lm1pbix4Lm1pbiksZT1uZXcgYyhrLHcubWF4LHgubWluKSx0aGlzLl9saW5lM2QodSx0LGUsdGhpcy5ncmlkQ29sb3IpKTp0aGlzLnNob3dYQXhpcyYmKHQ9bmV3IGMoayx3Lm1pbix4Lm1pbiksZT1uZXcgYyhrLHcubWluK2YseC5taW4pLHRoaXMuX2xpbmUzZCh1LHQsZSx0aGlzLmF4aXNDb2xvciksdD1uZXcgYyhrLHcubWF4LHgubWluKSxlPW5ldyBjKGssdy5tYXgtZix4Lm1pbiksdGhpcy5fbGluZTNkKHUsdCxlLHRoaXMuYXhpc0NvbG9yKSksdGhpcy5zaG93WEF4aXMpe3I9Yi54PjA/dy5taW46dy5tYXg7dmFyIE09bmV3IGMoayxyLHgubWluKSxTPSIgICIrdGhpcy54VmFsdWVMYWJlbChrKSsiICAiO3RoaXMuZHJhd0F4aXNMYWJlbFgodSxNLFMseSxnKX1pLm5leHQoKX1mb3IodS5saW5lV2lkdGg9MSxvPXZvaWQgMD09PXRoaXMuZGVmYXVsdFlTdGVwLGk9bmV3IHYody5taW4sdy5tYXgsdGhpcy55U3RlcCxvKSxpLnN0YXJ0KCEwKTshaS5lbmQoKTspe3ZhciBEPWkuZ2V0Q3VycmVudCgpO2lmKHRoaXMuc2hvd0dyaWQ/KHQ9bmV3IGMoXy5taW4sRCx4Lm1pbiksZT1uZXcgYyhfLm1heCxELHgubWluKSx0aGlzLl9saW5lM2QodSx0LGUsdGhpcy5ncmlkQ29sb3IpKTp0aGlzLnNob3dZQXhpcyYmKHQ9bmV3IGMoXy5taW4sRCx4Lm1pbiksZT1uZXcgYyhfLm1pbittLEQseC5taW4pLHRoaXMuX2xpbmUzZCh1LHQsZSx0aGlzLmF4aXNDb2xvciksdD1uZXcgYyhfLm1heCxELHgubWluKSxlPW5ldyBjKF8ubWF4LW0sRCx4Lm1pbiksdGhpcy5fbGluZTNkKHUsdCxlLHRoaXMuYXhpc0NvbG9yKSksdGhpcy5zaG93WUF4aXMpe3M9Yi55PjA/Xy5taW46Xy5tYXgsTT1uZXcgYyhzLEQseC5taW4pO3ZhciBTPSIgICIrdGhpcy55VmFsdWVMYWJlbChEKSsiICAiO3RoaXMuZHJhd0F4aXNMYWJlbFkodSxNLFMseSxnKX1pLm5leHQoKX1pZih0aGlzLnNob3daQXhpcyl7Zm9yKHUubGluZVdpZHRoPTEsbz12b2lkIDA9PT10aGlzLmRlZmF1bHRaU3RlcCxpPW5ldyB2KHgubWluLHgubWF4LHRoaXMuelN0ZXAsbyksaS5zdGFydCghMCkscz1iLng+MD9fLm1pbjpfLm1heCxyPWIueTwwP3cubWluOncubWF4OyFpLmVuZCgpOyl7dmFyIE89aS5nZXRDdXJyZW50KCksQz1uZXcgYyhzLHIsTyksVD10aGlzLl9jb252ZXJ0M0R0bzJEKEMpO2U9bmV3IHAoVC54LWcsVC55KSx0aGlzLl9saW5lKHUsVCxlLHRoaXMuYXhpc0NvbG9yKTt2YXIgUz10aGlzLnpWYWx1ZUxhYmVsKE8pKyIgIjt0aGlzLmRyYXdBeGlzTGFiZWxaKHUsQyxTLDUpLGkubmV4dCgpfXUubGluZVdpZHRoPTEsdD1uZXcgYyhzLHIseC5taW4pLGU9bmV3IGMocyxyLHgubWF4KSx0aGlzLl9saW5lM2QodSx0LGUsdGhpcy5heGlzQ29sb3IpfWlmKHRoaXMuc2hvd1hBeGlzKXt2YXIgRSxQO3UubGluZVdpZHRoPTEsRT1uZXcgYyhfLm1pbix3Lm1pbix4Lm1pbiksUD1uZXcgYyhfLm1heCx3Lm1pbix4Lm1pbiksdGhpcy5fbGluZTNkKHUsRSxQLHRoaXMuYXhpc0NvbG9yKSxFPW5ldyBjKF8ubWluLHcubWF4LHgubWluKSxQPW5ldyBjKF8ubWF4LHcubWF4LHgubWluKSx0aGlzLl9saW5lM2QodSxFLFAsdGhpcy5heGlzQ29sb3IpfXRoaXMuc2hvd1lBeGlzJiYodS5saW5lV2lkdGg9MSx0PW5ldyBjKF8ubWluLHcubWluLHgubWluKSxlPW5ldyBjKF8ubWluLHcubWF4LHgubWluKSx0aGlzLl9saW5lM2QodSx0LGUsdGhpcy5heGlzQ29sb3IpLHQ9bmV3IGMoXy5tYXgsdy5taW4seC5taW4pLGU9bmV3IGMoXy5tYXgsdy5tYXgseC5taW4pLHRoaXMuX2xpbmUzZCh1LHQsZSx0aGlzLmF4aXNDb2xvcikpO3ZhciBJPXRoaXMueExhYmVsO0kubGVuZ3RoPjAmJnRoaXMuc2hvd1hBeGlzJiYobD0uMS90aGlzLnNjYWxlLnkscz0oXy5tYXgrMypfLm1pbikvNCxyPWIueD4wP3cubWluLWw6dy5tYXgrbCxuPW5ldyBjKHMscix4Lm1pbiksdGhpcy5kcmF3QXhpc0xhYmVsWCh1LG4sSSx5KSk7dmFyIE49dGhpcy55TGFiZWw7Ti5sZW5ndGg+MCYmdGhpcy5zaG93WUF4aXMmJihkPS4xL3RoaXMuc2NhbGUueCxzPWIueT4wP18ubWluLWQ6Xy5tYXgrZCxyPSh3Lm1heCszKncubWluKS80LG49bmV3IGMocyxyLHgubWluKSx0aGlzLmRyYXdBeGlzTGFiZWxZKHUsbixOLHkpKTt2YXIgUj10aGlzLnpMYWJlbDtSLmxlbmd0aD4wJiZ0aGlzLnNob3daQXhpcyYmKGg9MzAscz1iLng+MD9fLm1pbjpfLm1heCxyPWIueTwwP3cubWluOncubWF4LGE9KHgubWF4KzMqeC5taW4pLzQsbj1uZXcgYyhzLHIsYSksdGhpcy5kcmF3QXhpc0xhYmVsWih1LG4sUixoKSl9LG8ucHJvdG90eXBlLl9oc3YycmdiPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbyxuLHMscixhLGg7c3dpdGNoKHI9aSplLGE9TWF0aC5mbG9vcih0LzYwKSxoPXIqKDEtTWF0aC5hYnModC82MCUyLTEpKSxhKXtjYXNlIDA6bz1yLG49aCxzPTA7YnJlYWs7Y2FzZSAxOm89aCxuPXIscz0wO2JyZWFrO2Nhc2UgMjpvPTAsbj1yLHM9aDticmVhaztjYXNlIDM6bz0wLG49aCxzPXI7YnJlYWs7Y2FzZSA0Om89aCxuPTAscz1yO2JyZWFrO2Nhc2UgNTpvPXIsbj0wLHM9aDticmVhaztkZWZhdWx0Om89MCxuPTAscz0wfXJldHVybiJSR0IoIitwYXJzZUludCgyNTUqbykrIiwiK3BhcnNlSW50KDI1NSpuKSsiLCIrcGFyc2VJbnQoMjU1KnMpKyIpIn0sby5wcm90b3R5cGUuX2dldFN0cm9rZVdpZHRoPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10P3RoaXMuc2hvd1BlcnNwZWN0aXZlPzEvLXQudHJhbnMueip0aGlzLmRhdGFDb2xvci5zdHJva2VXaWR0aDotdGhpcy5leWUuei90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSp0aGlzLmRhdGFDb2xvci5zdHJva2VXaWR0aDp0aGlzLmRhdGFDb2xvci5zdHJva2VXaWR0aH0sby5wcm90b3R5cGUuX3JlZHJhd0Jhcj1mdW5jdGlvbih0LGUsaSxvLG4scyl7dmFyIHIsYSxoPXRoaXMsZD1lLnBvaW50LGw9dGhpcy56UmFuZ2UubWluLHU9W3twb2ludDpuZXcgYyhkLngtaSxkLnktbyxkLnopfSx7cG9pbnQ6bmV3IGMoZC54K2ksZC55LW8sZC56KX0se3BvaW50Om5ldyBjKGQueCtpLGQueStvLGQueil9LHtwb2ludDpuZXcgYyhkLngtaSxkLnkrbyxkLnopfV0scD1be3BvaW50Om5ldyBjKGQueC1pLGQueS1vLGwpfSx7cG9pbnQ6bmV3IGMoZC54K2ksZC55LW8sbCl9LHtwb2ludDpuZXcgYyhkLngraSxkLnkrbyxsKX0se3BvaW50Om5ldyBjKGQueC1pLGQueStvLGwpfV07dS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc2NyZWVuPWguX2NvbnZlcnQzRHRvMkQodC5wb2ludCl9KSxwLmZvckVhY2goZnVuY3Rpb24odCl7dC5zY3JlZW49aC5fY29udmVydDNEdG8yRCh0LnBvaW50KX0pO3ZhciBmPVt7Y29ybmVyczp1LGNlbnRlcjpjLmF2ZyhwWzBdLnBvaW50LHBbMl0ucG9pbnQpfSx7Y29ybmVyczpbdVswXSx1WzFdLHBbMV0scFswXV0sY2VudGVyOmMuYXZnKHBbMV0ucG9pbnQscFswXS5wb2ludCl9LHtjb3JuZXJzOlt1WzFdLHVbMl0scFsyXSxwWzFdXSxjZW50ZXI6Yy5hdmcocFsyXS5wb2ludCxwWzFdLnBvaW50KX0se2Nvcm5lcnM6W3VbMl0sdVszXSxwWzNdLHBbMl1dLGNlbnRlcjpjLmF2ZyhwWzNdLnBvaW50LHBbMl0ucG9pbnQpfSx7Y29ybmVyczpbdVszXSx1WzBdLHBbMF0scFszXV0sY2VudGVyOmMuYXZnKHBbMF0ucG9pbnQscFszXS5wb2ludCl9XTtmb3IoZS5zdXJmYWNlcz1mLHI9MDtyPGYubGVuZ3RoO3IrKyl7YT1mW3JdO3ZhciBtPXRoaXMuX2NvbnZlcnRQb2ludFRvVHJhbnNsYXRpb24oYS5jZW50ZXIpO2EuZGlzdD10aGlzLnNob3dQZXJzcGVjdGl2ZT9tLmxlbmd0aCgpOi1tLnp9Zm9yKGYuc29ydChmdW5jdGlvbih0LGUpe3ZhciBpPWUuZGlzdC10LmRpc3Q7cmV0dXJuIGl8fCh0LmNvcm5lcnM9PT11PzE6ZS5jb3JuZXJzPT09dT8tMTowKX0pLHQubGluZVdpZHRoPXRoaXMuX2dldFN0cm9rZVdpZHRoKGUpLHQuc3Ryb2tlU3R5bGU9cyx0LmZpbGxTdHlsZT1uLHI9MjtyPGYubGVuZ3RoO3IrKylhPWZbcl0sdGhpcy5fcG9seWdvbih0LGEuY29ybmVycyl9LG8ucHJvdG90eXBlLl9wb2x5Z29uPWZ1bmN0aW9uKHQsZSxpLG8pe2lmKCEoZS5sZW5ndGg8Mikpe3ZvaWQgMCE9PWkmJih0LmZpbGxTdHlsZT1pKSx2b2lkIDAhPT1vJiYodC5zdHJva2VTdHlsZT1vKSx0LmJlZ2luUGF0aCgpLHQubW92ZVRvKGVbMF0uc2NyZWVuLngsZVswXS5zY3JlZW4ueSk7Zm9yKHZhciBuPTE7bjxlLmxlbmd0aDsrK24pe3ZhciBzPWVbbl07dC5saW5lVG8ocy5zY3JlZW4ueCxzLnNjcmVlbi55KX10LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHQuc3Ryb2tlKCl9fSxvLnByb3RvdHlwZS5fZHJhd0NpcmNsZT1mdW5jdGlvbih0LGUsaSxvLG4pe3ZhciBzPXRoaXMuX2NhbGNSYWRpdXMoZSxuKTt0LmxpbmVXaWR0aD10aGlzLl9nZXRTdHJva2VXaWR0aChlKSx0LnN0cm9rZVN0eWxlPW8sdC5maWxsU3R5bGU9aSx0LmJlZ2luUGF0aCgpLHQuYXJjKGUuc2NyZWVuLngsZS5zY3JlZW4ueSxzLDAsMipNYXRoLlBJLCEwKSx0LmZpbGwoKSx0LnN0cm9rZSgpfSxvLnByb3RvdHlwZS5fZ2V0Q29sb3JzUmVndWxhcj1mdW5jdGlvbih0KXt2YXIgZT0yNDAqKDEtKHQucG9pbnQuei10aGlzLnpSYW5nZS5taW4pKnRoaXMuc2NhbGUuei90aGlzLnZlcnRpY2FsUmF0aW8pO3JldHVybntmaWxsOnRoaXMuX2hzdjJyZ2IoZSwxLDEpLGJvcmRlcjp0aGlzLl9oc3YycmdiKGUsMSwuOCl9fSxvLnByb3RvdHlwZS5fZ2V0Q29sb3JzQ29sb3I9ZnVuY3Rpb24odCl7dmFyIGUsaTtpZigic3RyaW5nIj09dHlwZW9mIHQucG9pbnQudmFsdWUpZT10LnBvaW50LnZhbHVlLGk9dC5wb2ludC52YWx1ZTtlbHNle3ZhciBvPTI0MCooMS0odC5wb2ludC52YWx1ZS10aGlzLnZhbHVlUmFuZ2UubWluKSp0aGlzLnNjYWxlLnZhbHVlKTtlPXRoaXMuX2hzdjJyZ2IobywxLDEpLGk9dGhpcy5faHN2MnJnYihvLDEsLjgpfXJldHVybntmaWxsOmUsYm9yZGVyOml9fSxvLnByb3RvdHlwZS5fZ2V0Q29sb3JzU2l6ZT1mdW5jdGlvbigpe3JldHVybntmaWxsOnRoaXMuZGF0YUNvbG9yLmZpbGwsYm9yZGVyOnRoaXMuZGF0YUNvbG9yLnN0cm9rZX19LG8ucHJvdG90eXBlLl9jYWxjUmFkaXVzPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dGhpcy5fZG90U2l6ZSgpKTt2YXIgaTtyZXR1cm4gaT10aGlzLnNob3dQZXJzcGVjdGl2ZT9lLy10LnRyYW5zLno6ZSooLXRoaXMuZXllLnovdGhpcy5jYW1lcmEuZ2V0QXJtTGVuZ3RoKCkpLGk8MCYmKGk9MCksaX0sby5wcm90b3R5cGUuX3JlZHJhd0JhckdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnhCYXJXaWR0aC8yLG89dGhpcy55QmFyV2lkdGgvMixuPXRoaXMuX2dldENvbG9yc1JlZ3VsYXIoZSk7dGhpcy5fcmVkcmF3QmFyKHQsZSxpLG8sbi5maWxsLG4uYm9yZGVyKX0sby5wcm90b3R5cGUuX3JlZHJhd0JhckNvbG9yR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMueEJhcldpZHRoLzIsbz10aGlzLnlCYXJXaWR0aC8yLG49dGhpcy5fZ2V0Q29sb3JzQ29sb3IoZSk7dGhpcy5fcmVkcmF3QmFyKHQsZSxpLG8sbi5maWxsLG4uYm9yZGVyKX0sby5wcm90b3R5cGUuX3JlZHJhd0JhclNpemVHcmFwaFBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9KGUucG9pbnQudmFsdWUtdGhpcy52YWx1ZVJhbmdlLm1pbikvdGhpcy52YWx1ZVJhbmdlLnJhbmdlKCksbz10aGlzLnhCYXJXaWR0aC8yKiguOCppKy4yKSxuPXRoaXMueUJhcldpZHRoLzIqKC44KmkrLjIpLHM9dGhpcy5fZ2V0Q29sb3JzU2l6ZSgpO3RoaXMuX3JlZHJhd0Jhcih0LGUsbyxuLHMuZmlsbCxzLmJvcmRlcil9LG8ucHJvdG90eXBlLl9yZWRyYXdEb3RHcmFwaFBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0Q29sb3JzUmVndWxhcihlKTt0aGlzLl9kcmF3Q2lyY2xlKHQsZSxpLmZpbGwsaS5ib3JkZXIpfSxvLnByb3RvdHlwZS5fcmVkcmF3RG90TGluZUdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9jb252ZXJ0M0R0bzJEKGUuYm90dG9tKTt0LmxpbmVXaWR0aD0xLHRoaXMuX2xpbmUodCxpLGUuc2NyZWVuLHRoaXMuZ3JpZENvbG9yKSx0aGlzLl9yZWRyYXdEb3RHcmFwaFBvaW50KHQsZSl9LG8ucHJvdG90eXBlLl9yZWRyYXdEb3RDb2xvckdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9nZXRDb2xvcnNDb2xvcihlKTt0aGlzLl9kcmF3Q2lyY2xlKHQsZSxpLmZpbGwsaS5ib3JkZXIpfSxvLnByb3RvdHlwZS5fcmVkcmF3RG90U2l6ZUdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9kb3RTaXplKCksbz0oZS5wb2ludC52YWx1ZS10aGlzLnZhbHVlUmFuZ2UubWluKS90aGlzLnZhbHVlUmFuZ2UucmFuZ2UoKSxuPWkqdGhpcy5kb3RTaXplTWluRnJhY3Rpb24scz1pKnRoaXMuZG90U2l6ZU1heEZyYWN0aW9uLW4scj1uK3MqbyxhPXRoaXMuX2dldENvbG9yc1NpemUoKTt0aGlzLl9kcmF3Q2lyY2xlKHQsZSxhLmZpbGwsYS5ib3JkZXIscil9LG8ucHJvdG90eXBlLl9yZWRyYXdTdXJmYWNlR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPWUucG9pbnRSaWdodCxvPWUucG9pbnRUb3Asbj1lLnBvaW50Q3Jvc3M7aWYodm9pZCAwIT09ZSYmdm9pZCAwIT09aSYmdm9pZCAwIT09byYmdm9pZCAwIT09bil7dmFyIHMscixhPSEwO2lmKHRoaXMuc2hvd0dyYXlCb3R0b218fHRoaXMuc2hvd1NoYWRvdyl7dmFyIGg9Yy5zdWJ0cmFjdChuLnRyYW5zLGUudHJhbnMpLGQ9Yy5zdWJ0cmFjdChvLnRyYW5zLGkudHJhbnMpLGw9Yy5jcm9zc1Byb2R1Y3QoaCxkKSx1PWwubGVuZ3RoKCk7YT1sLno+MH1pZihhKXt2YXIgcCxmPShlLnBvaW50LnoraS5wb2ludC56K28ucG9pbnQueituLnBvaW50LnopLzQsbT0yNDAqKDEtKGYtdGhpcy56UmFuZ2UubWluKSp0aGlzLnNjYWxlLnovdGhpcy52ZXJ0aWNhbFJhdGlvKTt0aGlzLnNob3dTaGFkb3c/KHA9TWF0aC5taW4oMStsLngvdS8yLDEpLHM9dGhpcy5faHN2MnJnYihtLDEscCkscj1zKToocD0xLHM9dGhpcy5faHN2MnJnYihtLDEscCkscj10aGlzLmF4aXNDb2xvcil9ZWxzZSBzPSJncmF5IixyPXRoaXMuYXhpc0NvbG9yO3QubGluZVdpZHRoPXRoaXMuX2dldFN0cm9rZVdpZHRoKGUpO3ZhciB2PVtlLGksbixvXTt0aGlzLl9wb2x5Z29uKHQsdixzLHIpfX0sby5wcm90b3R5cGUuX2RyYXdHcmlkTGluZT1mdW5jdGlvbih0LGUsaSl7aWYodm9pZCAwIT09ZSYmdm9pZCAwIT09aSl7dmFyIG89KGUucG9pbnQueitpLnBvaW50LnopLzIsbj0yNDAqKDEtKG8tdGhpcy56UmFuZ2UubWluKSp0aGlzLnNjYWxlLnovdGhpcy52ZXJ0aWNhbFJhdGlvKTt0LmxpbmVXaWR0aD0yKnRoaXMuX2dldFN0cm9rZVdpZHRoKGUpLHQuc3Ryb2tlU3R5bGU9dGhpcy5faHN2MnJnYihuLDEsMSksdGhpcy5fbGluZSh0LGUuc2NyZWVuLGkuc2NyZWVuKX19LG8ucHJvdG90eXBlLl9yZWRyYXdHcmlkR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3RoaXMuX2RyYXdHcmlkTGluZSh0LGUsZS5wb2ludFJpZ2h0KSx0aGlzLl9kcmF3R3JpZExpbmUodCxlLGUucG9pbnRUb3ApfSxvLnByb3RvdHlwZS5fcmVkcmF3TGluZUdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2b2lkIDAhPT1lLnBvaW50TmV4dCYmKHQubGluZVdpZHRoPXRoaXMuX2dldFN0cm9rZVdpZHRoKGUpLHQuc3Ryb2tlU3R5bGU9dGhpcy5kYXRhQ29sb3Iuc3Ryb2tlLHRoaXMuX2xpbmUodCxlLnNjcmVlbixlLnBvaW50TmV4dC5zY3JlZW4pKX0sby5wcm90b3R5cGUuX3JlZHJhd0RhdGFHcmFwaD1mdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fZ2V0Q29udGV4dCgpO2lmKCEodm9pZCAwPT09dGhpcy5kYXRhUG9pbnRzfHx0aGlzLmRhdGFQb2ludHMubGVuZ3RoPD0wKSlmb3IodGhpcy5fY2FsY1RyYW5zbGF0aW9ucyh0aGlzLmRhdGFQb2ludHMpLHQ9MDt0PHRoaXMuZGF0YVBvaW50cy5sZW5ndGg7dCsrKXt2YXIgaT10aGlzLmRhdGFQb2ludHNbdF07dGhpcy5fcG9pbnREcmF3aW5nTWV0aG9kLmNhbGwodGhpcyxlLGkpfX0sby5wcm90b3R5cGUuX3N0b3JlTW91c2VQb3NpdGlvbj1mdW5jdGlvbih0KXt0aGlzLnN0YXJ0TW91c2VYPW4odCksdGhpcy5zdGFydE1vdXNlWT1zKHQpLHRoaXMuX3N0YXJ0Q2FtZXJhT2Zmc2V0PXRoaXMuY2FtZXJhLmdldE9mZnNldCgpfSxvLnByb3RvdHlwZS5fb25Nb3VzZURvd249ZnVuY3Rpb24odCl7aWYodD10fHx3aW5kb3cuZXZlbnQsdGhpcy5sZWZ0QnV0dG9uRG93biYmdGhpcy5fb25Nb3VzZVVwKHQpLHRoaXMubGVmdEJ1dHRvbkRvd249dC53aGljaD8xPT09dC53aGljaDoxPT09dC5idXR0b24sdGhpcy5sZWZ0QnV0dG9uRG93bnx8dGhpcy50b3VjaERvd24pe3RoaXMuX3N0b3JlTW91c2VQb3NpdGlvbih0KSx0aGlzLnN0YXJ0U3RhcnQ9bmV3IERhdGUodGhpcy5zdGFydCksdGhpcy5zdGFydEVuZD1uZXcgRGF0ZSh0aGlzLmVuZCksdGhpcy5zdGFydEFybVJvdGF0aW9uPXRoaXMuY2FtZXJhLmdldEFybVJvdGF0aW9uKCksdGhpcy5mcmFtZS5zdHlsZS5jdXJzb3I9Im1vdmUiO3ZhciBlPXRoaXM7dGhpcy5vbm1vdXNlbW92ZT1mdW5jdGlvbih0KXtlLl9vbk1vdXNlTW92ZSh0KX0sdGhpcy5vbm1vdXNldXA9ZnVuY3Rpb24odCl7ZS5fb25Nb3VzZVVwKHQpfSx1LmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsZS5vbm1vdXNlbW92ZSksdS5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixlLm9ubW91c2V1cCksdS5wcmV2ZW50RGVmYXVsdCh0KX19LG8ucHJvdG90eXBlLl9vbk1vdXNlTW92ZT1mdW5jdGlvbih0KXt0aGlzLm1vdmluZz0hMCx0PXR8fHdpbmRvdy5ldmVudDt2YXIgZT1wYXJzZUZsb2F0KG4odCkpLXRoaXMuc3RhcnRNb3VzZVgsaT1wYXJzZUZsb2F0KHModCkpLXRoaXMuc3RhcnRNb3VzZVk7aWYodCYmITA9PT10LmN0cmxLZXkpe3ZhciBvPS41KnRoaXMuZnJhbWUuY2xpZW50V2lkdGgscj0uNSp0aGlzLmZyYW1lLmNsaWVudEhlaWdodCxhPSh0aGlzLl9zdGFydENhbWVyYU9mZnNldC54fHwwKS1lL28qdGhpcy5jYW1lcmEuYXJtTGVuZ3RoKi44LGg9KHRoaXMuX3N0YXJ0Q2FtZXJhT2Zmc2V0Lnl8fDApK2kvcip0aGlzLmNhbWVyYS5hcm1MZW5ndGgqLjg7dGhpcy5jYW1lcmEuc2V0T2Zmc2V0KGEsaCksdGhpcy5fc3RvcmVNb3VzZVBvc2l0aW9uKHQpfWVsc2V7dmFyIGQ9dGhpcy5zdGFydEFybVJvdGF0aW9uLmhvcml6b250YWwrZS8yMDAsbD10aGlzLnN0YXJ0QXJtUm90YXRpb24udmVydGljYWwraS8yMDAsYz1NYXRoLnNpbig0LzM2MCoyKk1hdGguUEkpO01hdGguYWJzKE1hdGguc2luKGQpKTxjJiYoZD1NYXRoLnJvdW5kKGQvTWF0aC5QSSkqTWF0aC5QSS0uMDAxKSxNYXRoLmFicyhNYXRoLmNvcyhkKSk8YyYmKGQ9KE1hdGgucm91bmQoZC9NYXRoLlBJLS41KSsuNSkqTWF0aC5QSS0uMDAxKSxNYXRoLmFicyhNYXRoLnNpbihsKSk8YyYmKGw9TWF0aC5yb3VuZChsL01hdGguUEkpKk1hdGguUEkpLE1hdGguYWJzKE1hdGguY29zKGwpKTxjJiYobD0oTWF0aC5yb3VuZChsL01hdGguUEktLjUpKy41KSpNYXRoLlBJKSx0aGlzLmNhbWVyYS5zZXRBcm1Sb3RhdGlvbihkLGwpfXRoaXMucmVkcmF3KCk7dmFyIHA9dGhpcy5nZXRDYW1lcmFQb3NpdGlvbigpO3RoaXMuZW1pdCgiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLHApLHUucHJldmVudERlZmF1bHQodCl9LG8ucHJvdG90eXBlLl9vbk1vdXNlVXA9ZnVuY3Rpb24odCl7dGhpcy5mcmFtZS5zdHlsZS5jdXJzb3I9ImF1dG8iLHRoaXMubGVmdEJ1dHRvbkRvd249ITEsdS5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLHRoaXMub25tb3VzZW1vdmUpLHUucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsdGhpcy5vbm1vdXNldXApLHUucHJldmVudERlZmF1bHQodCl9LG8ucHJvdG90eXBlLl9vbkNsaWNrPWZ1bmN0aW9uKHQpe2lmKHRoaXMub25jbGlja19jYWxsYmFjayl7aWYodGhpcy5tb3ZpbmcpdGhpcy5tb3Zpbmc9ITE7ZWxzZXt2YXIgZT10aGlzLmZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9bih0KS1lLmxlZnQsbz1zKHQpLWUudG9wLHI9dGhpcy5fZGF0YVBvaW50RnJvbVhZKGksbyk7ciYmdGhpcy5vbmNsaWNrX2NhbGxiYWNrKHIucG9pbnQuZGF0YSl9dS5wcmV2ZW50RGVmYXVsdCh0KX19LG8ucHJvdG90eXBlLl9vblRvb2x0aXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPW4odCktZS5sZWZ0LG89cyh0KS1lLnRvcDtpZih0aGlzLnNob3dUb29sdGlwKXtpZih0aGlzLnRvb2x0aXBUaW1lb3V0JiZjbGVhclRpbWVvdXQodGhpcy50b29sdGlwVGltZW91dCksdGhpcy5sZWZ0QnV0dG9uRG93bilyZXR1cm4gdm9pZCB0aGlzLl9oaWRlVG9vbHRpcCgpO2lmKHRoaXMudG9vbHRpcCYmdGhpcy50b29sdGlwLmRhdGFQb2ludCl7dmFyIHI9dGhpcy5fZGF0YVBvaW50RnJvbVhZKGksbyk7ciE9PXRoaXMudG9vbHRpcC5kYXRhUG9pbnQmJihyP3RoaXMuX3Nob3dUb29sdGlwKHIpOnRoaXMuX2hpZGVUb29sdGlwKCkpfWVsc2V7dmFyIGE9dGhpczt0aGlzLnRvb2x0aXBUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXthLnRvb2x0aXBUaW1lb3V0PW51bGw7dmFyIHQ9YS5fZGF0YVBvaW50RnJvbVhZKGksbyk7dCYmYS5fc2hvd1Rvb2x0aXAodCl9LDMwMCl9fX0sby5wcm90b3R5cGUuX29uVG91Y2hTdGFydD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoRG93bj0hMDt2YXIgZT10aGlzO3RoaXMub250b3VjaG1vdmU9ZnVuY3Rpb24odCl7ZS5fb25Ub3VjaE1vdmUodCl9LHRoaXMub250b3VjaGVuZD1mdW5jdGlvbih0KXtlLl9vblRvdWNoRW5kKHQpfSx1LmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsInRvdWNobW92ZSIsZS5vbnRvdWNobW92ZSksdS5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJ0b3VjaGVuZCIsZS5vbnRvdWNoZW5kKSx0aGlzLl9vbk1vdXNlRG93bih0KX0sby5wcm90b3R5cGUuX29uVG91Y2hNb3ZlPWZ1bmN0aW9uKHQpe3RoaXMuX29uTW91c2VNb3ZlKHQpfSxvLnByb3RvdHlwZS5fb25Ub3VjaEVuZD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoRG93bj0hMSx1LnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsInRvdWNobW92ZSIsdGhpcy5vbnRvdWNobW92ZSksdS5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJ0b3VjaGVuZCIsdGhpcy5vbnRvdWNoZW5kKSx0aGlzLl9vbk1vdXNlVXAodCl9LG8ucHJvdG90eXBlLl9vbldoZWVsPWZ1bmN0aW9uKHQpe3R8fCh0PXdpbmRvdy5ldmVudCk7dmFyIGU9MDtpZih0LndoZWVsRGVsdGE/ZT10LndoZWVsRGVsdGEvMTIwOnQuZGV0YWlsJiYoZT0tdC5kZXRhaWwvMyksZSl7dmFyIGk9dGhpcy5jYW1lcmEuZ2V0QXJtTGVuZ3RoKCksbz1pKigxLWUvMTApO3RoaXMuY2FtZXJhLnNldEFybUxlbmd0aChvKSx0aGlzLnJlZHJhdygpLHRoaXMuX2hpZGVUb29sdGlwKCl9dmFyIG49dGhpcy5nZXRDYW1lcmFQb3NpdGlvbigpO3RoaXMuZW1pdCgiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLG4pLHUucHJldmVudERlZmF1bHQodCl9LG8ucHJvdG90eXBlLl9pbnNpZGVUcmlhbmdsZT1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQ+MD8xOnQ8MD8tMTowfXZhciBvPWVbMF0sbj1lWzFdLHM9ZVsyXSxyPWkoKG4ueC1vLngpKih0Lnktby55KS0obi55LW8ueSkqKHQueC1vLngpKSxhPWkoKHMueC1uLngpKih0Lnktbi55KS0ocy55LW4ueSkqKHQueC1uLngpKSxoPWkoKG8ueC1zLngpKih0Lnktcy55KS0oby55LXMueSkqKHQueC1zLngpKTtyZXR1cm4hKDAhPXImJjAhPWEmJnIhPWF8fDAhPWEmJjAhPWgmJmEhPWh8fDAhPXImJjAhPWgmJnIhPWgpfSxvLnByb3RvdHlwZS5fZGF0YVBvaW50RnJvbVhZPWZ1bmN0aW9uKHQsZSl7dmFyIGksbj1udWxsLHM9bnVsbCxyPW51bGwsYT1uZXcgcCh0LGUpO2lmKHRoaXMuc3R5bGU9PT1vLlNUWUxFLkJBUnx8dGhpcy5zdHlsZT09PW8uU1RZTEUuQkFSQ09MT1J8fHRoaXMuc3R5bGU9PT1vLlNUWUxFLkJBUlNJWkUpZm9yKGk9dGhpcy5kYXRhUG9pbnRzLmxlbmd0aC0xO2k+PTA7aS0tKXtuPXRoaXMuZGF0YVBvaW50c1tpXTt2YXIgaD1uLnN1cmZhY2VzO2lmKGgpZm9yKHZhciBkPWgubGVuZ3RoLTE7ZD49MDtkLS0pe3ZhciBsPWhbZF0sdT1sLmNvcm5lcnMsYz1bdVswXS5zY3JlZW4sdVsxXS5zY3JlZW4sdVsyXS5zY3JlZW5dLGY9W3VbMl0uc2NyZWVuLHVbM10uc2NyZWVuLHVbMF0uc2NyZWVuXTtpZih0aGlzLl9pbnNpZGVUcmlhbmdsZShhLGMpfHx0aGlzLl9pbnNpZGVUcmlhbmdsZShhLGYpKXJldHVybiBufX1lbHNlIGZvcihpPTA7aTx0aGlzLmRhdGFQb2ludHMubGVuZ3RoO2krKyl7bj10aGlzLmRhdGFQb2ludHNbaV07dmFyIG09bi5zY3JlZW47aWYobSl7dmFyIHY9TWF0aC5hYnModC1tLngpLGc9TWF0aC5hYnMoZS1tLnkpLHk9TWF0aC5zcXJ0KHYqditnKmcpOyhudWxsPT09cnx8eTxyKSYmeTwxMDAmJihyPXkscz1uKX19cmV0dXJuIHN9LG8ucHJvdG90eXBlLl9zaG93VG9vbHRpcD1mdW5jdGlvbih0KXt2YXIgZSxpLG87dGhpcy50b29sdGlwPyhlPXRoaXMudG9vbHRpcC5kb20uY29udGVudCxpPXRoaXMudG9vbHRpcC5kb20ubGluZSxvPXRoaXMudG9vbHRpcC5kb20uZG90KTooZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwoMCxhLmRlZmF1bHQpKGUuc3R5bGUse30sdGhpcy50b29sdGlwU3R5bGUuY29udGVudCksZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksKDAsYS5kZWZhdWx0KShpLnN0eWxlLHt9LHRoaXMudG9vbHRpcFN0eWxlLmxpbmUpLGkuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLCgwLGEuZGVmYXVsdCkoby5zdHlsZSx7fSx0aGlzLnRvb2x0aXBTdHlsZS5kb3QpLG8uc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRvb2x0aXA9e2RhdGFQb2ludDpudWxsLGRvbTp7Y29udGVudDplLGxpbmU6aSxkb3Q6b319KSx0aGlzLl9oaWRlVG9vbHRpcCgpLHRoaXMudG9vbHRpcC5kYXRhUG9pbnQ9dCwKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuc2hvd1Rvb2x0aXA/ZS5pbm5lckhUTUw9dGhpcy5zaG93VG9vbHRpcCh0LnBvaW50KTplLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+Iit0aGlzLnhMYWJlbCsiOjwvdGQ+PHRkPiIrdC5wb2ludC54KyI8L3RkPjwvdHI+PHRyPjx0ZD4iK3RoaXMueUxhYmVsKyI6PC90ZD48dGQ+Iit0LnBvaW50LnkrIjwvdGQ+PC90cj48dHI+PHRkPiIrdGhpcy56TGFiZWwrIjo8L3RkPjx0ZD4iK3QucG9pbnQueisiPC90ZD48L3RyPjwvdGFibGU+IixlLnN0eWxlLmxlZnQ9IjAiLGUuc3R5bGUudG9wPSIwIix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKGUpLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQoaSksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZChvKTt2YXIgbj1lLm9mZnNldFdpZHRoLHM9ZS5vZmZzZXRIZWlnaHQscj1pLm9mZnNldEhlaWdodCxoPW8ub2Zmc2V0V2lkdGgsZD1vLm9mZnNldEhlaWdodCxsPXQuc2NyZWVuLngtbi8yO2w9TWF0aC5taW4oTWF0aC5tYXgobCwxMCksdGhpcy5mcmFtZS5jbGllbnRXaWR0aC0xMC1uKSxpLnN0eWxlLmxlZnQ9dC5zY3JlZW4ueCsicHgiLGkuc3R5bGUudG9wPXQuc2NyZWVuLnktcisicHgiLGUuc3R5bGUubGVmdD1sKyJweCIsZS5zdHlsZS50b3A9dC5zY3JlZW4ueS1yLXMrInB4IixvLnN0eWxlLmxlZnQ9dC5zY3JlZW4ueC1oLzIrInB4IixvLnN0eWxlLnRvcD10LnNjcmVlbi55LWQvMisicHgifSxvLnByb3RvdHlwZS5faGlkZVRvb2x0aXA9ZnVuY3Rpb24oKXtpZih0aGlzLnRvb2x0aXApe3RoaXMudG9vbHRpcC5kYXRhUG9pbnQ9bnVsbDtmb3IodmFyIHQgaW4gdGhpcy50b29sdGlwLmRvbSlpZih0aGlzLnRvb2x0aXAuZG9tLmhhc093blByb3BlcnR5KHQpKXt2YXIgZT10aGlzLnRvb2x0aXAuZG9tW3RdO2UmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfX19LG8ucHJvdG90eXBlLnNldENhbWVyYVBvc2l0aW9uPWZ1bmN0aW9uKHQpe3kuc2V0Q2FtZXJhUG9zaXRpb24odCx0aGlzKSx0aGlzLnJlZHJhdygpfSxvLnByb3RvdHlwZS5zZXRTaXplPWZ1bmN0aW9uKHQsZSl7dGhpcy5fc2V0U2l6ZSh0LGUpLHRoaXMucmVkcmF3KCl9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoOTYpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSg5NyksdC5leHBvcnRzPWkoMTcpLk9iamVjdC5hc3NpZ259LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDE1KTtvKG8uUytvLkYsIk9iamVjdCIse2Fzc2lnbjppKDk4KX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgzNSksbj1pKDczKSxzPWkoNzQpLHI9aSg0OSksYT1pKDEwKSxoPU9iamVjdC5hc3NpZ247dC5leHBvcnRzPSFofHxpKDI2KShmdW5jdGlvbigpe3ZhciB0PXt9LGU9e30saT1TeW1ib2woKSxvPSJhYmNkZWZnaGlqa2xtbm9wcXJzdCI7cmV0dXJuIHRbaV09NyxvLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dH0pLDchPWgoe30sdClbaV18fE9iamVjdC5rZXlzKGgoe30sZSkpLmpvaW4oIiIpIT1vfSk/ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9cih0KSxoPWFyZ3VtZW50cy5sZW5ndGgsZD0xLGw9bi5mLHU9cy5mO2g+ZDspZm9yKHZhciBjLHA9YShhcmd1bWVudHNbZCsrXSksZj1sP28ocCkuY29uY2F0KGwocCkpOm8ocCksbT1mLmxlbmd0aCx2PTA7bT52Oyl1LmNhbGwocCxjPWZbdisrXSkmJihpW2NdPXBbY10pO3JldHVybiBpfTpofSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7aWYodClyZXR1cm4gbyh0KX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZSBpbiBpLnByb3RvdHlwZSl0W2VdPWkucHJvdG90eXBlW2VdO3JldHVybiB0fXQuZXhwb3J0cz1pLGkucHJvdG90eXBlLm9uPWkucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e30sKHRoaXMuX2NhbGxiYWNrc1t0XT10aGlzLl9jYWxsYmFja3NbdF18fFtdKS5wdXNoKGUpLHRoaXN9LGkucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKCl7by5vZmYodCxpKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX12YXIgbz10aGlzO3JldHVybiB0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fSxpLmZuPWUsdGhpcy5vbih0LGkpLHRoaXN9LGkucHJvdG90eXBlLm9mZj1pLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1pLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9aS5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9LDA9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX2NhbGxiYWNrcz17fSx0aGlzO3ZhciBpPXRoaXMuX2NhbGxiYWNrc1t0XTtpZighaSlyZXR1cm4gdGhpcztpZigxPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBkZWxldGUgdGhpcy5fY2FsbGJhY2tzW3RdLHRoaXM7Zm9yKHZhciBvLG49MDtuPGkubGVuZ3RoO24rKylpZigobz1pW25dKT09PWV8fG8uZm49PT1lKXtpLnNwbGljZShuLDEpO2JyZWFrfXJldHVybiB0aGlzfSxpLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe3RoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9O3ZhciBlPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGk9dGhpcy5fY2FsbGJhY2tzW3RdO2lmKGkpe2k9aS5zbGljZSgwKTtmb3IodmFyIG89MCxuPWkubGVuZ3RoO288bjsrK28paVtvXS5hcHBseSh0aGlzLGUpfXJldHVybiB0aGlzfSxpLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9LHRoaXMuX2NhbGxiYWNrc1t0XXx8W119LGkucHJvdG90eXBlLmhhc0xpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMubGlzdGVuZXJzKHQpLmxlbmd0aH19LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0LGUsaSl7dGhpcy54PXZvaWQgMCE9PXQ/dDowLHRoaXMueT12b2lkIDAhPT1lP2U6MCx0aGlzLno9dm9pZCAwIT09aT9pOjB9aS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUpe3ZhciBvPW5ldyBpO3JldHVybiBvLng9dC54LWUueCxvLnk9dC55LWUueSxvLno9dC56LWUueixvfSxpLmFkZD1mdW5jdGlvbih0LGUpe3ZhciBvPW5ldyBpO3JldHVybiBvLng9dC54K2UueCxvLnk9dC55K2UueSxvLno9dC56K2UueixvfSxpLmF2Zz1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgaSgodC54K2UueCkvMiwodC55K2UueSkvMiwodC56K2UueikvMil9LGkuY3Jvc3NQcm9kdWN0PWZ1bmN0aW9uKHQsZSl7dmFyIG89bmV3IGk7cmV0dXJuIG8ueD10LnkqZS56LXQueiplLnksby55PXQueiplLngtdC54KmUueixvLno9dC54KmUueS10LnkqZS54LG99LGkucHJvdG90eXBlLmxlbmd0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfSx0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQsZSl7dGhpcy54PXZvaWQgMCE9PXQ/dDowLHRoaXMueT12b2lkIDAhPT1lP2U6MH10LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8oKXt0aGlzLmFybUxvY2F0aW9uPW5ldyByLHRoaXMuYXJtUm90YXRpb249e30sdGhpcy5hcm1Sb3RhdGlvbi5ob3Jpem9udGFsPTAsdGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbD0wLHRoaXMuYXJtTGVuZ3RoPTEuNyx0aGlzLmNhbWVyYU9mZnNldD1uZXcgcix0aGlzLm9mZnNldE11bHRpcGxpZXI9LjYsdGhpcy5jYW1lcmFMb2NhdGlvbj1uZXcgcix0aGlzLmNhbWVyYVJvdGF0aW9uPW5ldyByKC41Kk1hdGguUEksMCwwKSx0aGlzLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uKCl9dmFyIG49aSgxMDMpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMTAwKTtvLnByb3RvdHlwZS5zZXRPZmZzZXQ9ZnVuY3Rpb24odCxlKXt2YXIgaT1NYXRoLmFicyxvPXMuZGVmYXVsdCxuPXRoaXMub2Zmc2V0TXVsdGlwbGllcixyPXRoaXMuYXJtTGVuZ3RoKm47aSh0KT5yJiYodD1vKHQpKnIpLGkoZSk+ciYmKGU9byhlKSpyKSx0aGlzLmNhbWVyYU9mZnNldC54PXQsdGhpcy5jYW1lcmFPZmZzZXQueT1lLHRoaXMuY2FsY3VsYXRlQ2FtZXJhT3JpZW50YXRpb24oKX0sby5wcm90b3R5cGUuZ2V0T2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY2FtZXJhT2Zmc2V0fSxvLnByb3RvdHlwZS5zZXRBcm1Mb2NhdGlvbj1mdW5jdGlvbih0LGUsaSl7dGhpcy5hcm1Mb2NhdGlvbi54PXQsdGhpcy5hcm1Mb2NhdGlvbi55PWUsdGhpcy5hcm1Mb2NhdGlvbi56PWksdGhpcy5jYWxjdWxhdGVDYW1lcmFPcmllbnRhdGlvbigpfSxvLnByb3RvdHlwZS5zZXRBcm1Sb3RhdGlvbj1mdW5jdGlvbih0LGUpe3ZvaWQgMCE9PXQmJih0aGlzLmFybVJvdGF0aW9uLmhvcml6b250YWw9dCksdm9pZCAwIT09ZSYmKHRoaXMuYXJtUm90YXRpb24udmVydGljYWw9ZSx0aGlzLmFybVJvdGF0aW9uLnZlcnRpY2FsPDAmJih0aGlzLmFybVJvdGF0aW9uLnZlcnRpY2FsPTApLHRoaXMuYXJtUm90YXRpb24udmVydGljYWw+LjUqTWF0aC5QSSYmKHRoaXMuYXJtUm90YXRpb24udmVydGljYWw9LjUqTWF0aC5QSSkpLHZvaWQgMD09PXQmJnZvaWQgMD09PWV8fHRoaXMuY2FsY3VsYXRlQ2FtZXJhT3JpZW50YXRpb24oKX0sby5wcm90b3R5cGUuZ2V0QXJtUm90YXRpb249ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gdC5ob3Jpem9udGFsPXRoaXMuYXJtUm90YXRpb24uaG9yaXpvbnRhbCx0LnZlcnRpY2FsPXRoaXMuYXJtUm90YXRpb24udmVydGljYWwsdH0sby5wcm90b3R5cGUuc2V0QXJtTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQmJih0aGlzLmFybUxlbmd0aD10LHRoaXMuYXJtTGVuZ3RoPC43MSYmKHRoaXMuYXJtTGVuZ3RoPS43MSksdGhpcy5hcm1MZW5ndGg+NSYmKHRoaXMuYXJtTGVuZ3RoPTUpLHRoaXMuc2V0T2Zmc2V0KHRoaXMuY2FtZXJhT2Zmc2V0LngsdGhpcy5jYW1lcmFPZmZzZXQueSksdGhpcy5jYWxjdWxhdGVDYW1lcmFPcmllbnRhdGlvbigpKX0sby5wcm90b3R5cGUuZ2V0QXJtTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJtTGVuZ3RofSxvLnByb3RvdHlwZS5nZXRDYW1lcmFMb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbWVyYUxvY2F0aW9ufSxvLnByb3RvdHlwZS5nZXRDYW1lcmFSb3RhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbWVyYVJvdGF0aW9ufSxvLnByb3RvdHlwZS5jYWxjdWxhdGVDYW1lcmFPcmllbnRhdGlvbj1mdW5jdGlvbigpe3RoaXMuY2FtZXJhTG9jYXRpb24ueD10aGlzLmFybUxvY2F0aW9uLngtdGhpcy5hcm1MZW5ndGgqTWF0aC5zaW4odGhpcy5hcm1Sb3RhdGlvbi5ob3Jpem9udGFsKSpNYXRoLmNvcyh0aGlzLmFybVJvdGF0aW9uLnZlcnRpY2FsKSx0aGlzLmNhbWVyYUxvY2F0aW9uLnk9dGhpcy5hcm1Mb2NhdGlvbi55LXRoaXMuYXJtTGVuZ3RoKk1hdGguY29zKHRoaXMuYXJtUm90YXRpb24uaG9yaXpvbnRhbCkqTWF0aC5jb3ModGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbCksdGhpcy5jYW1lcmFMb2NhdGlvbi56PXRoaXMuYXJtTG9jYXRpb24ueit0aGlzLmFybUxlbmd0aCpNYXRoLnNpbih0aGlzLmFybVJvdGF0aW9uLnZlcnRpY2FsKSx0aGlzLmNhbWVyYVJvdGF0aW9uLng9TWF0aC5QSS8yLXRoaXMuYXJtUm90YXRpb24udmVydGljYWwsdGhpcy5jYW1lcmFSb3RhdGlvbi55PTAsdGhpcy5jYW1lcmFSb3RhdGlvbi56PS10aGlzLmFybVJvdGF0aW9uLmhvcml6b250YWw7dmFyIHQ9dGhpcy5jYW1lcmFSb3RhdGlvbi54LGU9KHRoaXMuY2FtZXJhUm90YXRpb24ueSx0aGlzLmNhbWVyYVJvdGF0aW9uLnopLGk9dGhpcy5jYW1lcmFPZmZzZXQueCxvPXRoaXMuY2FtZXJhT2Zmc2V0Lnksbj1NYXRoLnNpbixzPU1hdGguY29zO3RoaXMuY2FtZXJhTG9jYXRpb24ueD10aGlzLmNhbWVyYUxvY2F0aW9uLngraSpzKGUpK28qLW4oZSkqcyh0KSx0aGlzLmNhbWVyYUxvY2F0aW9uLnk9dGhpcy5jYW1lcmFMb2NhdGlvbi55K2kqbihlKStvKnMoZSkqcyh0KSx0aGlzLmNhbWVyYUxvY2F0aW9uLno9dGhpcy5jYW1lcmFMb2NhdGlvbi56K28qbih0KX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSgxMDQpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSgxMDUpLHQuZXhwb3J0cz1pKDE3KS5NYXRoLnNpZ259LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDE1KTtvKG8uUywiTWF0aCIse3NpZ246aSgxMDYpfSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPU1hdGguc2lnbnx8ZnVuY3Rpb24odCl7cmV0dXJuIDA9PSh0PSt0KXx8dCE9dD90OnQ8MD8tMToxfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe3RoaXMuZGF0YT10LHRoaXMuY29sdW1uPWUsdGhpcy5ncmFwaD1pLHRoaXMuaW5kZXg9dm9pZCAwLHRoaXMudmFsdWU9dm9pZCAwLHRoaXMudmFsdWVzPWkuZ2V0RGlzdGluY3RWYWx1ZXModC5nZXQoKSx0aGlzLmNvbHVtbiksdGhpcy52YWx1ZXMuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0PmU/MTp0PGU/LTE6MH0pLHRoaXMudmFsdWVzLmxlbmd0aD4wJiZ0aGlzLnNlbGVjdFZhbHVlKDApLHRoaXMuZGF0YVBvaW50cz1bXSx0aGlzLmxvYWRlZD0hMSx0aGlzLm9uTG9hZENhbGxiYWNrPXZvaWQgMCxpLmFuaW1hdGlvblByZWxvYWQ/KHRoaXMubG9hZGVkPSExLHRoaXMubG9hZEluQmFja2dyb3VuZCgpKTp0aGlzLmxvYWRlZD0hMH12YXIgbj1pKDkzKTtvLnByb3RvdHlwZS5pc0xvYWRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvYWRlZH0sby5wcm90b3R5cGUuZ2V0TG9hZGVkUHJvZ3Jlc3M9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy52YWx1ZXMubGVuZ3RoLGU9MDt0aGlzLmRhdGFQb2ludHNbZV07KWUrKztyZXR1cm4gTWF0aC5yb3VuZChlL3QqMTAwKX0sby5wcm90b3R5cGUuZ2V0TGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ncmFwaC5maWx0ZXJMYWJlbH0sby5wcm90b3R5cGUuZ2V0Q29sdW1uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sdW1ufSxvLnByb3RvdHlwZS5nZXRTZWxlY3RlZFZhbHVlPWZ1bmN0aW9uKCl7aWYodm9pZCAwIT09dGhpcy5pbmRleClyZXR1cm4gdGhpcy52YWx1ZXNbdGhpcy5pbmRleF19LG8ucHJvdG90eXBlLmdldFZhbHVlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlc30sby5wcm90b3R5cGUuZ2V0VmFsdWU9ZnVuY3Rpb24odCl7aWYodD49dGhpcy52YWx1ZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7cmV0dXJuIHRoaXMudmFsdWVzW3RdfSxvLnByb3RvdHlwZS5fZ2V0RGF0YVBvaW50cz1mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10JiYodD10aGlzLmluZGV4KSx2b2lkIDA9PT10KXJldHVybltdO3ZhciBlO2lmKHRoaXMuZGF0YVBvaW50c1t0XSllPXRoaXMuZGF0YVBvaW50c1t0XTtlbHNle3ZhciBpPXt9O2kuY29sdW1uPXRoaXMuY29sdW1uLGkudmFsdWU9dGhpcy52YWx1ZXNbdF07dmFyIG89bmV3IG4odGhpcy5kYXRhLHtmaWx0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRbaS5jb2x1bW5dPT1pLnZhbHVlfX0pLmdldCgpO2U9dGhpcy5ncmFwaC5fZ2V0RGF0YVBvaW50cyhvKSx0aGlzLmRhdGFQb2ludHNbdF09ZX1yZXR1cm4gZX0sby5wcm90b3R5cGUuc2V0T25Mb2FkQ2FsbGJhY2s9ZnVuY3Rpb24odCl7dGhpcy5vbkxvYWRDYWxsYmFjaz10fSxvLnByb3RvdHlwZS5zZWxlY3RWYWx1ZT1mdW5jdGlvbih0KXtpZih0Pj10aGlzLnZhbHVlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTt0aGlzLmluZGV4PXQsdGhpcy52YWx1ZT10aGlzLnZhbHVlc1t0XX0sby5wcm90b3R5cGUubG9hZEluQmFja2dyb3VuZD1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0wKTt2YXIgZT10aGlzLmdyYXBoLmZyYW1lO2lmKHQ8dGhpcy52YWx1ZXMubGVuZ3RoKXt0aGlzLl9nZXREYXRhUG9pbnRzKHQpO3ZvaWQgMD09PWUucHJvZ3Jlc3MmJihlLnByb2dyZXNzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLGUucHJvZ3Jlc3Muc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnByb2dyZXNzLnN0eWxlLmNvbG9yPSJncmF5IixlLmFwcGVuZENoaWxkKGUucHJvZ3Jlc3MpKTt2YXIgaT10aGlzLmdldExvYWRlZFByb2dyZXNzKCk7ZS5wcm9ncmVzcy5pbm5lckhUTUw9IkxvYWRpbmcgYW5pbWF0aW9uLi4uICIraSsiJSIsZS5wcm9ncmVzcy5zdHlsZS5ib3R0b209IjYwcHgiLGUucHJvZ3Jlc3Muc3R5bGUubGVmdD0iMTBweCI7dmFyIG89dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5sb2FkSW5CYWNrZ3JvdW5kKHQrMSl9LDEwKSx0aGlzLmxvYWRlZD0hMX1lbHNlIHRoaXMubG9hZGVkPSEwLHZvaWQgMCE9PWUucHJvZ3Jlc3MmJihlLnJlbW92ZUNoaWxkKGUucHJvZ3Jlc3MpLGUucHJvZ3Jlc3M9dm9pZCAwKSx0aGlzLm9uTG9hZENhbGxiYWNrJiZ0aGlzLm9uTG9hZENhbGxiYWNrKCl9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKCJObyBjb250YWluZXIgZWxlbWVudCBkZWZpbmVkIik7aWYodGhpcy5jb250YWluZXI9dCx0aGlzLnZpc2libGU9IWV8fHZvaWQgMD09ZS52aXNpYmxlfHxlLnZpc2libGUsdGhpcy52aXNpYmxlKXt0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHRoaXMuZnJhbWUuc3R5bGUud2lkdGg9IjEwMCUiLHRoaXMuZnJhbWUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lKSx0aGlzLmZyYW1lLnByZXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiSU5QVVQiKSx0aGlzLmZyYW1lLnByZXYudHlwZT0iQlVUVE9OIix0aGlzLmZyYW1lLnByZXYudmFsdWU9IlByZXYiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5wcmV2KSx0aGlzLmZyYW1lLnBsYXk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiSU5QVVQiKSx0aGlzLmZyYW1lLnBsYXkudHlwZT0iQlVUVE9OIix0aGlzLmZyYW1lLnBsYXkudmFsdWU9IlBsYXkiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5wbGF5KSx0aGlzLmZyYW1lLm5leHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiSU5QVVQiKSx0aGlzLmZyYW1lLm5leHQudHlwZT0iQlVUVE9OIix0aGlzLmZyYW1lLm5leHQudmFsdWU9Ik5leHQiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5uZXh0KSx0aGlzLmZyYW1lLmJhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJJTlBVVCIpLHRoaXMuZnJhbWUuYmFyLnR5cGU9IkJVVFRPTiIsdGhpcy5mcmFtZS5iYXIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmZyYW1lLmJhci5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCByZWQiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLndpZHRoPSIxMDBweCIsdGhpcy5mcmFtZS5iYXIuc3R5bGUuaGVpZ2h0PSI2cHgiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLmJvcmRlclJhZGl1cz0iMnB4Iix0aGlzLmZyYW1lLmJhci5zdHlsZS5Nb3pCb3JkZXJSYWRpdXM9IjJweCIsdGhpcy5mcmFtZS5iYXIuc3R5bGUuYm9yZGVyPSIxcHggc29saWQgIzdGN0Y3RiIsdGhpcy5mcmFtZS5iYXIuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjRTVFNUU1Iix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUuYmFyKSx0aGlzLmZyYW1lLnNsaWRlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIklOUFVUIiksdGhpcy5mcmFtZS5zbGlkZS50eXBlPSJCVVRUT04iLHRoaXMuZnJhbWUuc2xpZGUuc3R5bGUubWFyZ2luPSIwcHgiLHRoaXMuZnJhbWUuc2xpZGUudmFsdWU9IiAiLHRoaXMuZnJhbWUuc2xpZGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLmZyYW1lLnNsaWRlLnN0eWxlLmxlZnQ9Ii0xMDBweCIsdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lLnNsaWRlKTt2YXIgaT10aGlzO3RoaXMuZnJhbWUuc2xpZGUub25tb3VzZWRvd249ZnVuY3Rpb24odCl7aS5fb25Nb3VzZURvd24odCl9LHRoaXMuZnJhbWUucHJldi5vbmNsaWNrPWZ1bmN0aW9uKHQpe2kucHJldih0KX0sdGhpcy5mcmFtZS5wbGF5Lm9uY2xpY2s9ZnVuY3Rpb24odCl7aS50b2dnbGVQbGF5KHQpfSx0aGlzLmZyYW1lLm5leHQub25jbGljaz1mdW5jdGlvbih0KXtpLm5leHQodCl9fXRoaXMub25DaGFuZ2VDYWxsYmFjaz12b2lkIDAsdGhpcy52YWx1ZXM9W10sdGhpcy5pbmRleD12b2lkIDAsdGhpcy5wbGF5VGltZW91dD12b2lkIDAsdGhpcy5wbGF5SW50ZXJ2YWw9MWUzLHRoaXMucGxheUxvb3A9ITB9dmFyIG49aSgxKTtvLnByb3RvdHlwZS5wcmV2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRJbmRleCgpO3Q+MCYmKHQtLSx0aGlzLnNldEluZGV4KHQpKX0sby5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0SW5kZXgoKTt0PHRoaXMudmFsdWVzLmxlbmd0aC0xJiYodCsrLHRoaXMuc2V0SW5kZXgodCkpfSxvLnByb3RvdHlwZS5wbGF5TmV4dD1mdW5jdGlvbigpe3ZhciB0PW5ldyBEYXRlLGU9dGhpcy5nZXRJbmRleCgpO2U8dGhpcy52YWx1ZXMubGVuZ3RoLTE/KGUrKyx0aGlzLnNldEluZGV4KGUpKTp0aGlzLnBsYXlMb29wJiYoZT0wLHRoaXMuc2V0SW5kZXgoZSkpO3ZhciBpPW5ldyBEYXRlLG89aS10LG49TWF0aC5tYXgodGhpcy5wbGF5SW50ZXJ2YWwtbywwKSxzPXRoaXM7dGhpcy5wbGF5VGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cy5wbGF5TmV4dCgpfSxuKX0sby5wcm90b3R5cGUudG9nZ2xlUGxheT1mdW5jdGlvbigpe3ZvaWQgMD09PXRoaXMucGxheVRpbWVvdXQ/dGhpcy5wbGF5KCk6dGhpcy5zdG9wKCl9LG8ucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLnBsYXlUaW1lb3V0fHwodGhpcy5wbGF5TmV4dCgpLHRoaXMuZnJhbWUmJih0aGlzLmZyYW1lLnBsYXkudmFsdWU9IlN0b3AiKSl9LG8ucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMucGxheVRpbWVvdXQpLHRoaXMucGxheVRpbWVvdXQ9dm9pZCAwLHRoaXMuZnJhbWUmJih0aGlzLmZyYW1lLnBsYXkudmFsdWU9IlBsYXkiKX0sby5wcm90b3R5cGUuc2V0T25DaGFuZ2VDYWxsYmFjaz1mdW5jdGlvbih0KXt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2s9dH0sby5wcm90b3R5cGUuc2V0UGxheUludGVydmFsPWZ1bmN0aW9uKHQpe3RoaXMucGxheUludGVydmFsPXR9LG8ucHJvdG90eXBlLmdldFBsYXlJbnRlcnZhbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wbGF5SW50ZXJ2YWx9LG8ucHJvdG90eXBlLnNldFBsYXlMb29wPWZ1bmN0aW9uKHQpe3RoaXMucGxheUxvb3A9dH0sby5wcm90b3R5cGUub25DaGFuZ2U9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLm9uQ2hhbmdlQ2FsbGJhY2smJnRoaXMub25DaGFuZ2VDYWxsYmFjaygpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXtpZih0aGlzLmZyYW1lKXt0aGlzLmZyYW1lLmJhci5zdHlsZS50b3A9dGhpcy5mcmFtZS5jbGllbnRIZWlnaHQvMi10aGlzLmZyYW1lLmJhci5vZmZzZXRIZWlnaHQvMisicHgiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLndpZHRoPXRoaXMuZnJhbWUuY2xpZW50V2lkdGgtdGhpcy5mcmFtZS5wcmV2LmNsaWVudFdpZHRoLXRoaXMuZnJhbWUucGxheS5jbGllbnRXaWR0aC10aGlzLmZyYW1lLm5leHQuY2xpZW50V2lkdGgtMzArInB4Ijt2YXIgdD10aGlzLmluZGV4VG9MZWZ0KHRoaXMuaW5kZXgpO3RoaXMuZnJhbWUuc2xpZGUuc3R5bGUubGVmdD10KyJweCJ9fSxvLnByb3RvdHlwZS5zZXRWYWx1ZXM9ZnVuY3Rpb24odCl7dGhpcy52YWx1ZXM9dCx0aGlzLnZhbHVlcy5sZW5ndGg+MD90aGlzLnNldEluZGV4KDApOnRoaXMuaW5kZXg9dm9pZCAwfSxvLnByb3RvdHlwZS5zZXRJbmRleD1mdW5jdGlvbih0KXtpZighKHQ8dGhpcy52YWx1ZXMubGVuZ3RoKSl0aHJvdyBuZXcgRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO3RoaXMuaW5kZXg9dCx0aGlzLnJlZHJhdygpLHRoaXMub25DaGFuZ2UoKX0sby5wcm90b3R5cGUuZ2V0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbmRleH0sby5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVzW3RoaXMuaW5kZXhdfSxvLnByb3RvdHlwZS5fb25Nb3VzZURvd249ZnVuY3Rpb24odCl7aWYodC53aGljaD8xPT09dC53aGljaDoxPT09dC5idXR0b24pe3RoaXMuc3RhcnRDbGllbnRYPXQuY2xpZW50WCx0aGlzLnN0YXJ0U2xpZGVYPXBhcnNlRmxvYXQodGhpcy5mcmFtZS5zbGlkZS5zdHlsZS5sZWZ0KSx0aGlzLmZyYW1lLnN0eWxlLmN1cnNvcj0ibW92ZSI7dmFyIGU9dGhpczt0aGlzLm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKHQpe2UuX29uTW91c2VNb3ZlKHQpfSx0aGlzLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLl9vbk1vdXNlVXAodCl9LG4uYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIix0aGlzLm9ubW91c2Vtb3ZlKSxuLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLHRoaXMub25tb3VzZXVwKSxuLnByZXZlbnREZWZhdWx0KHQpfX0sby5wcm90b3R5cGUubGVmdFRvSW5kZXg9ZnVuY3Rpb24odCl7dmFyIGU9cGFyc2VGbG9hdCh0aGlzLmZyYW1lLmJhci5zdHlsZS53aWR0aCktdGhpcy5mcmFtZS5zbGlkZS5jbGllbnRXaWR0aC0xMCxpPXQtMyxvPU1hdGgucm91bmQoaS9lKih0aGlzLnZhbHVlcy5sZW5ndGgtMSkpO3JldHVybiBvPDAmJihvPTApLG8+dGhpcy52YWx1ZXMubGVuZ3RoLTEmJihvPXRoaXMudmFsdWVzLmxlbmd0aC0xKSxvfSxvLnByb3RvdHlwZS5pbmRleFRvTGVmdD1mdW5jdGlvbih0KXt2YXIgZT1wYXJzZUZsb2F0KHRoaXMuZnJhbWUuYmFyLnN0eWxlLndpZHRoKS10aGlzLmZyYW1lLnNsaWRlLmNsaWVudFdpZHRoLTEwO3JldHVybiB0Lyh0aGlzLnZhbHVlcy5sZW5ndGgtMSkqZSszfSxvLnByb3RvdHlwZS5fb25Nb3VzZU1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dC5jbGllbnRYLXRoaXMuc3RhcnRDbGllbnRYLGk9dGhpcy5zdGFydFNsaWRlWCtlLG89dGhpcy5sZWZ0VG9JbmRleChpKTt0aGlzLnNldEluZGV4KG8pLG4ucHJldmVudERlZmF1bHQoKX0sby5wcm90b3R5cGUuX29uTW91c2VVcD1mdW5jdGlvbih0KXt0aGlzLmZyYW1lLnN0eWxlLmN1cnNvcj0iYXV0byIsbi5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLHRoaXMub25tb3VzZW1vdmUpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsdGhpcy5vbm1vdXNldXApLG4ucHJldmVudERlZmF1bHQoKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0LGUsaSxvKXt0aGlzLl9zdGFydD0wLHRoaXMuX2VuZD0wLHRoaXMuX3N0ZXA9MSx0aGlzLnByZXR0eVN0ZXA9ITAsdGhpcy5wcmVjaXNpb249NSx0aGlzLl9jdXJyZW50PTAsdGhpcy5zZXRSYW5nZSh0LGUsaSxvKX1pLnByb3RvdHlwZS5pc051bWVyaWM9ZnVuY3Rpb24odCl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQodCkpJiZpc0Zpbml0ZSh0KX0saS5wcm90b3R5cGUuc2V0UmFuZ2U9ZnVuY3Rpb24odCxlLGksbyl7aWYoIXRoaXMuaXNOdW1lcmljKHQpKXRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVyICdzdGFydCcgaXMgbm90IG51bWVyaWM7IHZhbHVlOiAiK3QpO2lmKCF0aGlzLmlzTnVtZXJpYyhlKSl0aHJvdyBuZXcgRXJyb3IoIlBhcmFtZXRlciAnZW5kJyBpcyBub3QgbnVtZXJpYzsgdmFsdWU6ICIrdCk7aWYoIXRoaXMuaXNOdW1lcmljKGkpKXRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVyICdzdGVwJyBpcyBub3QgbnVtZXJpYzsgdmFsdWU6ICIrdCk7dGhpcy5fc3RhcnQ9dHx8MCx0aGlzLl9lbmQ9ZXx8MCx0aGlzLnNldFN0ZXAoaSxvKX0saS5wcm90b3R5cGUuc2V0U3RlcD1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PXR8fHQ8PTB8fCh2b2lkIDAhPT1lJiYodGhpcy5wcmV0dHlTdGVwPWUpLCEwPT09dGhpcy5wcmV0dHlTdGVwP3RoaXMuX3N0ZXA9aS5jYWxjdWxhdGVQcmV0dHlTdGVwKHQpOnRoaXMuX3N0ZXA9dCl9LGkuY2FsY3VsYXRlUHJldHR5U3RlcD1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjEwfSxpPU1hdGgucG93KDEwLE1hdGgucm91bmQoZSh0KSkpLG89MipNYXRoLnBvdygxMCxNYXRoLnJvdW5kKGUodC8yKSkpLG49NSpNYXRoLnBvdygxMCxNYXRoLnJvdW5kKGUodC81KSkpLHM9aTtyZXR1cm4gTWF0aC5hYnMoby10KTw9TWF0aC5hYnMocy10KSYmKHM9byksTWF0aC5hYnMobi10KTw9TWF0aC5hYnMocy10KSYmKHM9biksczw9MCYmKHM9MSksc30saS5wcm90b3R5cGUuZ2V0Q3VycmVudD1mdW5jdGlvbigpe3JldHVybiBwYXJzZUZsb2F0KHRoaXMuX2N1cnJlbnQudG9QcmVjaXNpb24odGhpcy5wcmVjaXNpb24pKX0saS5wcm90b3R5cGUuZ2V0U3RlcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGVwfSxpLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMSksdGhpcy5fY3VycmVudD10aGlzLl9zdGFydC10aGlzLl9zdGFydCV0aGlzLl9zdGVwLHQmJnRoaXMuZ2V0Q3VycmVudCgpPHRoaXMuX3N0YXJ0JiZ0aGlzLm5leHQoKX0saS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3RoaXMuX2N1cnJlbnQrPXRoaXMuX3N0ZXB9LGkucHJvdG90eXBlLmVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50PnRoaXMuX2VuZH0sdC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSgpe3RoaXMubWluPXZvaWQgMCx0aGlzLm1heD12b2lkIDB9aS5wcm90b3R5cGUuYWRqdXN0PWZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQmJigodm9pZCAwPT09dGhpcy5taW58fHRoaXMubWluPnQpJiYodGhpcy5taW49dCksKHZvaWQgMD09PXRoaXMubWF4fHx0aGlzLm1heDx0KSYmKHRoaXMubWF4PXQpKX0saS5wcm90b3R5cGUuY29tYmluZT1mdW5jdGlvbih0KXt0aGlzLmFkZCh0Lm1pbiksdGhpcy5hZGQodC5tYXgpfSxpLnByb3RvdHlwZS5leHBhbmQ9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dmFyIGU9dGhpcy5taW4tdCxpPXRoaXMubWF4K3Q7aWYoZT5pKXRocm93IG5ldyBFcnJvcigiUGFzc2VkIGV4cGFuc2lvbiB2YWx1ZSBtYWtlcyByYW5nZSBpbnZhbGlkIik7dGhpcy5taW49ZSx0aGlzLm1heD1pfX0saS5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXgtdGhpcy5taW59LGkucHJvdG90eXBlLmNlbnRlcj1mdW5jdGlvbigpe3JldHVybih0aGlzLm1pbit0aGlzLm1heCkvMn0sdC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gbih0KXtyZXR1cm4gdm9pZCAwPT09dHx8IiI9PT10fHwic3RyaW5nIiE9dHlwZW9mIHQ/dDp0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSl9ZnVuY3Rpb24gcyh0LGUpe3JldHVybiB2b2lkIDA9PT10fHwiIj09PXQ/ZTp0K24oZSl9ZnVuY3Rpb24gcih0LGUsaSxvKXt2YXIgbixyO2Zvcih2YXIgYSBpbiBpKW49aVthXSxyPXMobyxuKSxlW3JdPXRbbl19ZnVuY3Rpb24gYSh0LGUsaSxvKXt2YXIgbixyO2Zvcih2YXIgYSBpbiBpKW49aVthXSx2b2lkIDAhPT10W25dJiYocj1zKG8sbiksZVtyXT10W25dKX1mdW5jdGlvbiBoKHQsZSl7aWYodm9pZCAwPT09dHx8byh0KSl0aHJvdyBuZXcgRXJyb3IoIk5vIERFRkFVTFRTIHBhc3NlZCIpO2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKCJObyBkc3QgcGFzc2VkIik7Tz10LHIodCxlLFMpLHIodCxlLEQsImRlZmF1bHQiKSxsKHQsZSksZS5tYXJnaW49MTAsZS5zaG93R3JheUJvdHRvbT0hMSxlLnNob3dUb29sdGlwPSExLGUub25jbGlja19jYWxsYmFjaz1udWxsLGUuZXllPW5ldyB4KDAsMCwtMSl9ZnVuY3Rpb24gZCh0LGUpe2lmKHZvaWQgMCE9PXQpe2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKCJObyBkc3QgcGFzc2VkIik7aWYodm9pZCAwPT09T3x8byhPKSl0aHJvdyBuZXcgRXJyb3IoIkRFRkFVTFRTIG5vdCBzZXQgZm9yIG1vZHVsZSBTZXR0aW5ncyIpO2EodCxlLFMpLGEodCxlLEQsImRlZmF1bHQiKSxsKHQsZSl9fWZ1bmN0aW9uIGwodCxlKXt2b2lkIDAhPT10LmJhY2tncm91bmRDb2xvciYmbSh0LmJhY2tncm91bmRDb2xvcixlKSx2KHQuZGF0YUNvbG9yLGUpLGYodC5zdHlsZSxlKSx1KHQuc2hvd0xlZ2VuZCxlKSxnKHQuY2FtZXJhUG9zaXRpb24sZSksdm9pZCAwIT09dC50b29sdGlwJiYoZS5zaG93VG9vbHRpcD10LnRvb2x0aXApLHZvaWQgMCE9dC5vbmNsaWNrJiYoZS5vbmNsaWNrX2NhbGxiYWNrPXQub25jbGljayksdm9pZCAwIT09dC50b29sdGlwU3R5bGUmJl8uc2VsZWN0aXZlRGVlcEV4dGVuZChbInRvb2x0aXBTdHlsZSJdLGUsdCl9ZnVuY3Rpb24gdSh0LGUpe2lmKHZvaWQgMD09PXQpe2lmKHZvaWQgMD09PU8uc2hvd0xlZ2VuZCl7dmFyIGk9ZS5zdHlsZT09PWsuRE9UQ09MT1J8fGUuc3R5bGU9PT1rLkRPVFNJWkU7ZS5zaG93TGVnZW5kPWl9fWVsc2UgZS5zaG93TGVnZW5kPXR9ZnVuY3Rpb24gYyh0KXt2YXIgZT1NW3RdO3JldHVybiB2b2lkIDA9PT1lPy0xOmV9ZnVuY3Rpb24gcCh0KXt2YXIgZT0hMTtmb3IodmFyIGkgaW4gaylpZihrW2ldPT09dCl7ZT0hMDticmVha31yZXR1cm4gZX1mdW5jdGlvbiBmKHQsZSl7aWYodm9pZCAwIT09dCl7dmFyIGk7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigtMT09PShpPWModCkpKXRocm93IG5ldyBFcnJvcigiU3R5bGUgJyIrdCsiJyBpcyBpbnZhbGlkIil9ZWxzZXtpZighcCh0KSl0aHJvdyBuZXcgRXJyb3IoIlN0eWxlICciK3QrIicgaXMgaW52YWxpZCIpO2k9dH1lLnN0eWxlPWl9fWZ1bmN0aW9uIG0odCxlKXt2YXIgaT0id2hpdGUiLG89ImdyYXkiLG49MTtpZigic3RyaW5nIj09dHlwZW9mIHQpaT10LG89Im5vbmUiLG49MDtlbHNle2lmKCJvYmplY3QiIT09KHZvaWQgMD09PXQ/InVuZGVmaW5lZCI6KDAsYi5kZWZhdWx0KSh0KSkpdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCB0eXBlIG9mIGJhY2tncm91bmRDb2xvciIpO3ZvaWQgMCE9PXQuZmlsbCYmKGk9dC5maWxsKSx2b2lkIDAhPT10LnN0cm9rZSYmKG89dC5zdHJva2UpLHZvaWQgMCE9PXQuc3Ryb2tlV2lkdGgmJihuPXQuc3Ryb2tlV2lkdGgpfWUuZnJhbWUuc3R5bGUuYmFja2dyb3VuZENvbG9yPWksZS5mcmFtZS5zdHlsZS5ib3JkZXJDb2xvcj1vLGUuZnJhbWUuc3R5bGUuYm9yZGVyV2lkdGg9bisicHgiLGUuZnJhbWUuc3R5bGUuYm9yZGVyU3R5bGU9InNvbGlkIn1mdW5jdGlvbiB2KHQsZSl7dm9pZCAwIT09dCYmKHZvaWQgMD09PWUuZGF0YUNvbG9yJiYoZS5kYXRhQ29sb3I9e30pLCJzdHJpbmciPT10eXBlb2YgdD8oZS5kYXRhQ29sb3IuZmlsbD10LGUuZGF0YUNvbG9yLnN0cm9rZT10KToodC5maWxsJiYoZS5kYXRhQ29sb3IuZmlsbD10LmZpbGwpLHQuc3Ryb2tlJiYoZS5kYXRhQ29sb3Iuc3Ryb2tlPXQuc3Ryb2tlKSx2b2lkIDAhPT10LnN0cm9rZVdpZHRoJiYoZS5kYXRhQ29sb3Iuc3Ryb2tlV2lkdGg9dC5zdHJva2VXaWR0aCkpKX1mdW5jdGlvbiBnKHQsZSl7dmFyIGk9dDt2b2lkIDAhPT1pJiYodm9pZCAwPT09ZS5jYW1lcmEmJihlLmNhbWVyYT1uZXcgdyksZS5jYW1lcmEuc2V0QXJtUm90YXRpb24oaS5ob3Jpem9udGFsLGkudmVydGljYWwpLGUuY2FtZXJhLnNldEFybUxlbmd0aChpLmRpc3RhbmNlKSl9dmFyIHk9aSg2MiksYj1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KHkpLF89aSgxKSx3PWkoMTAyKSx4PWkoMTAwKSxrPXtCQVI6MCxCQVJDT0xPUjoxLEJBUlNJWkU6MixET1Q6MyxET1RMSU5FOjQsRE9UQ09MT1I6NSxET1RTSVpFOjYsR1JJRDo3LExJTkU6OCxTVVJGQUNFOjl9LE09e2RvdDprLkRPVCwiZG90LWxpbmUiOmsuRE9UTElORSwiZG90LWNvbG9yIjprLkRPVENPTE9SLCJkb3Qtc2l6ZSI6ay5ET1RTSVpFLGxpbmU6ay5MSU5FLGdyaWQ6ay5HUklELHN1cmZhY2U6ay5TVVJGQUNFLGJhcjprLkJBUiwiYmFyLWNvbG9yIjprLkJBUkNPTE9SLCJiYXItc2l6ZSI6ay5CQVJTSVpFfSxTPVsid2lkdGgiLCJoZWlnaHQiLCJmaWx0ZXJMYWJlbCIsImxlZ2VuZExhYmVsIiwieExhYmVsIiwieUxhYmVsIiwiekxhYmVsIiwieFZhbHVlTGFiZWwiLCJ5VmFsdWVMYWJlbCIsInpWYWx1ZUxhYmVsIiwic2hvd1hBeGlzIiwic2hvd1lBeGlzIiwic2hvd1pBeGlzIiwic2hvd0dyaWQiLCJzaG93UGVyc3BlY3RpdmUiLCJzaG93U2hhZG93Iiwia2VlcEFzcGVjdFJhdGlvIiwidmVydGljYWxSYXRpbyIsImRvdFNpemVSYXRpbyIsImRvdFNpemVNaW5GcmFjdGlvbiIsImRvdFNpemVNYXhGcmFjdGlvbiIsInNob3dBbmltYXRpb25Db250cm9scyIsImFuaW1hdGlvbkludGVydmFsIiwiYW5pbWF0aW9uUHJlbG9hZCIsImFuaW1hdGlvbkF1dG9TdGFydCIsImF4aXNDb2xvciIsImdyaWRDb2xvciIsInhDZW50ZXIiLCJ5Q2VudGVyIl0sRD1bInhCYXJXaWR0aCIsInlCYXJXaWR0aCIsInZhbHVlTWluIiwidmFsdWVNYXgiLCJ4TWluIiwieE1heCIsInhTdGVwIiwieU1pbiIsInlNYXgiLCJ5U3RlcCIsInpNaW4iLCJ6TWF4IiwielN0ZXAiXSxPPXZvaWQgMDt0LmV4cG9ydHMuU1RZTEU9ayx0LmV4cG9ydHMuc2V0RGVmYXVsdHM9aCx0LmV4cG9ydHMuc2V0T3B0aW9ucz1kLHQuZXhwb3J0cy5zZXRDYW1lcmFQb3NpdGlvbj1nfSxmdW5jdGlvbih0LGUsaSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpe3ZhciBvPWkoMTEzKSxuPXdpbmRvdy5IYW1tZXJ8fGkoMTE0KTt0LmV4cG9ydHM9byhuLHtwcmV2ZW50RGVmYXVsdDoibW91c2UifSl9ZWxzZSB0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiaGFtbWVyLmpzIGlzIG9ubHkgYXZhaWxhYmxlIGluIGEgYnJvd3Nlciwgbm90IGluIG5vZGUuanMuIil9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG8sbixzOyFmdW5jdGlvbihpKXtuPVtdLG89aSx2b2lkIDAhPT0ocz0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vLmFwcGx5KGUsbik6bykmJih0LmV4cG9ydHM9cyl9KGZ1bmN0aW9uKCl7dmFyIHQ9bnVsbDtyZXR1cm4gZnVuY3Rpb24gZShpLG8pe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQubWF0Y2goL1teIF0rL2cpfWZ1bmN0aW9uIHMoZSl7aWYoImhhbW1lci5pbnB1dCIhPT1lLnR5cGUpe2lmKGUuc3JjRXZlbnQuX2hhbmRsZWR8fChlLnNyY0V2ZW50Ll9oYW5kbGVkPXt9KSxlLnNyY0V2ZW50Ll9oYW5kbGVkW2UudHlwZV0pcmV0dXJuO2Uuc3JjRXZlbnQuX2hhbmRsZWRbZS50eXBlXT0hMH12YXIgaT0hMTtlLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe2k9ITB9O3ZhciBvPWUuc3JjRXZlbnQuc3RvcFByb3BhZ2F0aW9uLmJpbmQoZS5zcmNFdmVudCk7ImZ1bmN0aW9uIj09dHlwZW9mIG8mJihlLnNyY0V2ZW50LnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe28oKSxlLnN0b3BQcm9wYWdhdGlvbigpfSksZS5maXJzdFRhcmdldD10O2Zvcih2YXIgbj10O24mJiFpOyl7dmFyIHM9bi5oYW1tZXI7aWYocylmb3IodmFyIHIsYT0wO2E8cy5sZW5ndGg7YSsrKWlmKHI9c1thXS5faGFuZGxlcnNbZS50eXBlXSlmb3IodmFyIGg9MDtoPHIubGVuZ3RoJiYhaTtoKyspcltoXShlKTtuPW4ucGFyZW50Tm9kZX19dmFyIHI9b3x8e3ByZXZlbnREZWZhdWx0OiExfTtpZihpLk1hbmFnZXIpe3ZhciBhPWksaD1mdW5jdGlvbih0LGkpe3ZhciBvPU9iamVjdC5jcmVhdGUocik7cmV0dXJuIGkmJmEuYXNzaWduKG8saSksZShuZXcgYSh0LG8pLG8pfTtyZXR1cm4gYS5hc3NpZ24oaCxhKSxoLk1hbmFnZXI9ZnVuY3Rpb24odCxpKXt2YXIgbz1PYmplY3QuY3JlYXRlKHIpO3JldHVybiBpJiZhLmFzc2lnbihvLGkpLGUobmV3IGEuTWFuYWdlcih0LG8pLG8pfSxofXZhciBkPU9iamVjdC5jcmVhdGUoaSksbD1pLmVsZW1lbnQ7cmV0dXJuIGwuaGFtbWVyfHwobC5oYW1tZXI9W10pLGwuaGFtbWVyLnB1c2goZCksaS5vbigiaGFtbWVyLmlucHV0IixmdW5jdGlvbihlKXshMCE9PXIucHJldmVudERlZmF1bHQmJnIucHJldmVudERlZmF1bHQhPT1lLnBvaW50ZXJUeXBlfHxlLnByZXZlbnREZWZhdWx0KCksZS5pc0ZpcnN0JiYodD1lLnRhcmdldCl9KSxkLl9oYW5kbGVycz17fSxkLm9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odCkuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbz1kLl9oYW5kbGVyc1t0XTtvfHwoZC5faGFuZGxlcnNbdF09bz1bXSxpLm9uKHQscykpLG8ucHVzaChlKX0pLGR9LGQub2ZmPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odCkuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbz1kLl9oYW5kbGVyc1t0XTtvJiYobz1lP28uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09ZX0pOltdLG8ubGVuZ3RoPjA/ZC5faGFuZGxlcnNbdF09bzooaS5vZmYodCxzKSxkZWxldGUgZC5faGFuZGxlcnNbdF0pKX0pLGR9LGQuZW1pdD1mdW5jdGlvbihlLG8pe3Q9by50YXJnZXQsaS5lbWl0KGUsbyl9LGQuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PWkuZWxlbWVudC5oYW1tZXIsZT10LmluZGV4T2YoZCk7LTEhPT1lJiZ0LnNwbGljZShlLDEpLHQubGVuZ3RofHxkZWxldGUgaS5lbGVtZW50LmhhbW1lcixkLl9oYW5kbGVycz17fSxpLmRlc3Ryb3koKX0sZH19KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvOyFmdW5jdGlvbihuLHMscixhKXtmdW5jdGlvbiBoKHQsZSxpKXtyZXR1cm4gc2V0VGltZW91dChwKHQsaSksZSl9ZnVuY3Rpb24gZCh0LGUsaSl7cmV0dXJuISFBcnJheS5pc0FycmF5KHQpJiYobCh0LGlbZV0saSksITApfWZ1bmN0aW9uIGwodCxlLGkpe3ZhciBvO2lmKHQpaWYodC5mb3JFYWNoKXQuZm9yRWFjaChlLGkpO2Vsc2UgaWYodC5sZW5ndGghPT1hKWZvcihvPTA7bzx0Lmxlbmd0aDspZS5jYWxsKGksdFtvXSxvLHQpLG8rKztlbHNlIGZvcihvIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShvKSYmZS5jYWxsKGksdFtvXSxvLHQpfWZ1bmN0aW9uIHUodCxlLGkpe3ZhciBvPSJERVBSRUNBVEVEIE1FVEhPRDogIitlKyJcbiIraSsiIEFUIFxuIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uZXcgRXJyb3IoImdldC1zdGFjay10cmFjZSIpLGk9ZSYmZS5zdGFjaz9lLnN0YWNrLnJlcGxhY2UoL15bXlwoXSs/W1xuJF0vZ20sIiIpLnJlcGxhY2UoL15ccythdFxzKy9nbSwiIikucmVwbGFjZSgvXk9iamVjdC48YW5vbnltb3VzPlxzKlwoL2dtLCJ7YW5vbnltb3VzfSgpQCIpOiJVbmtub3duIFN0YWNrIFRyYWNlIixzPW4uY29uc29sZSYmKG4uY29uc29sZS53YXJufHxuLmNvbnNvbGUubG9nKTtyZXR1cm4gcyYmcy5jYWxsKG4uY29uc29sZSxvLGkpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBjKHQsZSxpKXt2YXIgbyxuPWUucHJvdG90eXBlO289dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuKSxvLmNvbnN0cnVjdG9yPXQsby5fc3VwZXI9bixpJiZmdChvLGkpfWZ1bmN0aW9uIHAodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGYodCxlKXtyZXR1cm4gdHlwZW9mIHQ9PWd0P3QuYXBwbHkoZT9lWzBdfHxhOmEsZSk6dH1mdW5jdGlvbiBtKHQsZSl7cmV0dXJuIHQ9PT1hP2U6dH1mdW5jdGlvbiB2KHQsZSxpKXtsKF8oZSksZnVuY3Rpb24oZSl7dC5hZGRFdmVudExpc3RlbmVyKGUsaSwhMSl9KX1mdW5jdGlvbiBnKHQsZSxpKXtsKF8oZSksZnVuY3Rpb24oZSl7dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsaSwhMSl9KX1mdW5jdGlvbiB5KHQsZSl7Zm9yKDt0Oyl7aWYodD09ZSlyZXR1cm4hMDt0PXQucGFyZW50Tm9kZX1yZXR1cm4hMX1mdW5jdGlvbiBiKHQsZSl7cmV0dXJuIHQuaW5kZXhPZihlKT4tMX1mdW5jdGlvbiBfKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXHMrL2cpfWZ1bmN0aW9uIHcodCxlLGkpe2lmKHQuaW5kZXhPZiYmIWkpcmV0dXJuIHQuaW5kZXhPZihlKTtmb3IodmFyIG89MDtvPHQubGVuZ3RoOyl7aWYoaSYmdFtvXVtpXT09ZXx8IWkmJnRbb109PT1lKXJldHVybiBvO28rK31yZXR1cm4tMX1mdW5jdGlvbiB4KHQpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LDApfWZ1bmN0aW9uIGsodCxlLGkpe2Zvcih2YXIgbz1bXSxuPVtdLHM9MDtzPHQubGVuZ3RoOyl7dmFyIHI9ZT90W3NdW2VdOnRbc107dyhuLHIpPDAmJm8ucHVzaCh0W3NdKSxuW3NdPXIscysrfXJldHVybiBpJiYobz1lP28uc29ydChmdW5jdGlvbih0LGkpe3JldHVybiB0W2VdPmlbZV19KTpvLnNvcnQoKSksb31mdW5jdGlvbiBNKHQsZSl7Zm9yKHZhciBpLG8sbj1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxzPTA7czxtdC5sZW5ndGg7KXtpZihpPW10W3NdLChvPWk/aStuOmUpaW4gdClyZXR1cm4gbztzKyt9cmV0dXJuIGF9ZnVuY3Rpb24gUygpe3JldHVybiBrdCsrfWZ1bmN0aW9uIEQodCl7dmFyIGU9dC5vd25lckRvY3VtZW50fHx0O3JldHVybiBlLmRlZmF1bHRWaWV3fHxlLnBhcmVudFdpbmRvd3x8bn1mdW5jdGlvbiBPKHQsZSl7dmFyIGk9dGhpczt0aGlzLm1hbmFnZXI9dCx0aGlzLmNhbGxiYWNrPWUsdGhpcy5lbGVtZW50PXQuZWxlbWVudCx0aGlzLnRhcmdldD10Lm9wdGlvbnMuaW5wdXRUYXJnZXQsdGhpcy5kb21IYW5kbGVyPWZ1bmN0aW9uKGUpe2YodC5vcHRpb25zLmVuYWJsZSxbdF0pJiZpLmhhbmRsZXIoZSl9LHRoaXMuaW5pdCgpfWZ1bmN0aW9uIEModCl7dmFyIGU9dC5vcHRpb25zLmlucHV0Q2xhc3M7cmV0dXJuIG5ldyhlfHwoRHQ/VzpPdD9WOlN0P3E6SCkpKHQsVCl9ZnVuY3Rpb24gVCh0LGUsaSl7dmFyIG89aS5wb2ludGVycy5sZW5ndGgsbj1pLmNoYW5nZWRQb2ludGVycy5sZW5ndGgscz1lJlR0JiZvLW49PTAscj1lJihQdHxJdCkmJm8tbj09MDtpLmlzRmlyc3Q9ISFzLGkuaXNGaW5hbD0hIXIscyYmKHQuc2Vzc2lvbj17fSksaS5ldmVudFR5cGU9ZSxFKHQsaSksdC5lbWl0KCJoYW1tZXIuaW5wdXQiLGkpLHQucmVjb2duaXplKGkpLHQuc2Vzc2lvbi5wcmV2SW5wdXQ9aX1mdW5jdGlvbiBFKHQsZSl7dmFyIGk9dC5zZXNzaW9uLG89ZS5wb2ludGVycyxuPW8ubGVuZ3RoO2kuZmlyc3RJbnB1dHx8KGkuZmlyc3RJbnB1dD1OKGUpKSxuPjEmJiFpLmZpcnN0TXVsdGlwbGU/aS5maXJzdE11bHRpcGxlPU4oZSk6MT09PW4mJihpLmZpcnN0TXVsdGlwbGU9ITEpO3ZhciBzPWkuZmlyc3RJbnB1dCxyPWkuZmlyc3RNdWx0aXBsZSxhPXI/ci5jZW50ZXI6cy5jZW50ZXIsaD1lLmNlbnRlcj1SKG8pO2UudGltZVN0YW1wPV90KCksZS5kZWx0YVRpbWU9ZS50aW1lU3RhbXAtcy50aW1lU3RhbXAsZS5hbmdsZT1GKGEsaCksZS5kaXN0YW5jZT1MKGEsaCksUChpLGUpLGUub2Zmc2V0RGlyZWN0aW9uPXooZS5kZWx0YVgsZS5kZWx0YVkpO3ZhciBkPUEoZS5kZWx0YVRpbWUsZS5kZWx0YVgsZS5kZWx0YVkpO2Uub3ZlcmFsbFZlbG9jaXR5WD1kLngsZS5vdmVyYWxsVmVsb2NpdHlZPWQueSxlLm92ZXJhbGxWZWxvY2l0eT1idChkLngpPmJ0KGQueSk/ZC54OmQueSxlLnNjYWxlPXI/aihyLnBvaW50ZXJzLG8pOjEsZS5yb3RhdGlvbj1yP0Ioci5wb2ludGVycyxvKTowLGUubWF4UG9pbnRlcnM9aS5wcmV2SW5wdXQ/ZS5wb2ludGVycy5sZW5ndGg+aS5wcmV2SW5wdXQubWF4UG9pbnRlcnM/ZS5wb2ludGVycy5sZW5ndGg6aS5wcmV2SW5wdXQubWF4UG9pbnRlcnM6ZS5wb2ludGVycy5sZW5ndGgsSShpLGUpO3ZhciBsPXQuZWxlbWVudDt5KGUuc3JjRXZlbnQudGFyZ2V0LGwpJiYobD1lLnNyY0V2ZW50LnRhcmdldCksZS50YXJnZXQ9bH1mdW5jdGlvbiBQKHQsZSl7dmFyIGk9ZS5jZW50ZXIsbz10Lm9mZnNldERlbHRhfHx7fSxuPXQucHJldkRlbHRhfHx7fSxzPXQucHJldklucHV0fHx7fTtlLmV2ZW50VHlwZSE9PVR0JiZzLmV2ZW50VHlwZSE9PVB0fHwobj10LnByZXZEZWx0YT17eDpzLmRlbHRhWHx8MCx5OnMuZGVsdGFZfHwwfSxvPXQub2Zmc2V0RGVsdGE9e3g6aS54LHk6aS55fSksZS5kZWx0YVg9bi54KyhpLngtby54KSxlLmRlbHRhWT1uLnkrKGkueS1vLnkpfWZ1bmN0aW9uIEkodCxlKXt2YXIgaSxvLG4scyxyPXQubGFzdEludGVydmFsfHxlLGg9ZS50aW1lU3RhbXAtci50aW1lU3RhbXA7aWYoZS5ldmVudFR5cGUhPUl0JiYoaD5DdHx8ci52ZWxvY2l0eT09PWEpKXt2YXIgZD1lLmRlbHRhWC1yLmRlbHRhWCxsPWUuZGVsdGFZLXIuZGVsdGFZLHU9QShoLGQsbCk7bz11Lngsbj11LnksaT1idCh1LngpPmJ0KHUueSk/dS54OnUueSxzPXooZCxsKSx0Lmxhc3RJbnRlcnZhbD1lfWVsc2UgaT1yLnZlbG9jaXR5LG89ci52ZWxvY2l0eVgsbj1yLnZlbG9jaXR5WSxzPXIuZGlyZWN0aW9uO2UudmVsb2NpdHk9aSxlLnZlbG9jaXR5WD1vLGUudmVsb2NpdHlZPW4sZS5kaXJlY3Rpb249c31mdW5jdGlvbiBOKHQpe2Zvcih2YXIgZT1bXSxpPTA7aTx0LnBvaW50ZXJzLmxlbmd0aDspZVtpXT17Y2xpZW50WDp5dCh0LnBvaW50ZXJzW2ldLmNsaWVudFgpLGNsaWVudFk6eXQodC5wb2ludGVyc1tpXS5jbGllbnRZKX0saSsrO3JldHVybnt0aW1lU3RhbXA6X3QoKSxwb2ludGVyczplLGNlbnRlcjpSKGUpLGRlbHRhWDp0LmRlbHRhWCxkZWx0YVk6dC5kZWx0YVl9fWZ1bmN0aW9uIFIodCl7dmFyIGU9dC5sZW5ndGg7aWYoMT09PWUpcmV0dXJue3g6eXQodFswXS5jbGllbnRYKSx5Onl0KHRbMF0uY2xpZW50WSl9O2Zvcih2YXIgaT0wLG89MCxuPTA7bjxlOylpKz10W25dLmNsaWVudFgsbys9dFtuXS5jbGllbnRZLG4rKztyZXR1cm57eDp5dChpL2UpLHk6eXQoby9lKX19ZnVuY3Rpb24gQSh0LGUsaSl7cmV0dXJue3g6ZS90fHwwLHk6aS90fHwwfX1mdW5jdGlvbiB6KHQsZSl7cmV0dXJuIHQ9PT1lP050OmJ0KHQpPj1idChlKT90PDA/UnQ6QXQ6ZTwwP3p0Okx0fWZ1bmN0aW9uIEwodCxlLGkpe2l8fChpPUh0KTt2YXIgbz1lW2lbMF1dLXRbaVswXV0sbj1lW2lbMV1dLXRbaVsxXV07cmV0dXJuIE1hdGguc3FydChvKm8rbipuKX1mdW5jdGlvbiBGKHQsZSxpKXtpfHwoaT1IdCk7dmFyIG89ZVtpWzBdXS10W2lbMF1dLG49ZVtpWzFdXS10W2lbMV1dO3JldHVybiAxODAqTWF0aC5hdGFuMihuLG8pL01hdGguUEl9ZnVuY3Rpb24gQih0LGUpe3JldHVybiBGKGVbMV0sZVswXSxXdCkrRih0WzFdLHRbMF0sV3QpfWZ1bmN0aW9uIGoodCxlKXtyZXR1cm4gTChlWzBdLGVbMV0sV3QpL0wodFswXSx0WzFdLFd0KX1mdW5jdGlvbiBIKCl7dGhpcy5ldkVsPUd0LHRoaXMuZXZXaW49VnQsdGhpcy5wcmVzc2VkPSExLE8uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIFcoKXt0aGlzLmV2RWw9WHQsdGhpcy5ldldpbj1adCxPLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnN0b3JlPXRoaXMubWFuYWdlci5zZXNzaW9uLnBvaW50ZXJFdmVudHM9W119ZnVuY3Rpb24gWSgpe3RoaXMuZXZUYXJnZXQ9SnQsdGhpcy5ldldpbj1RdCx0aGlzLnN0YXJ0ZWQ9ITEsTy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gRyh0LGUpe3ZhciBpPXgodC50b3VjaGVzKSxvPXgodC5jaGFuZ2VkVG91Y2hlcyk7cmV0dXJuIGUmKFB0fEl0KSYmKGk9ayhpLmNvbmNhdChvKSwiaWRlbnRpZmllciIsITApKSxbaSxvXX1mdW5jdGlvbiBWKCl7dGhpcy5ldlRhcmdldD10ZSx0aGlzLnRhcmdldElkcz17fSxPLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBVKHQsZSl7dmFyIGk9eCh0LnRvdWNoZXMpLG89dGhpcy50YXJnZXRJZHM7aWYoZSYoVHR8RXQpJiYxPT09aS5sZW5ndGgpcmV0dXJuIG9baVswXS5pZGVudGlmaWVyXT0hMCxbaSxpXTt2YXIgbixzLHI9eCh0LmNoYW5nZWRUb3VjaGVzKSxhPVtdLGg9dGhpcy50YXJnZXQ7aWYocz1pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4geSh0LnRhcmdldCxoKX0pLGU9PT1UdClmb3Iobj0wO248cy5sZW5ndGg7KW9bc1tuXS5pZGVudGlmaWVyXT0hMCxuKys7Zm9yKG49MDtuPHIubGVuZ3RoOylvW3Jbbl0uaWRlbnRpZmllcl0mJmEucHVzaChyW25dKSxlJihQdHxJdCkmJmRlbGV0ZSBvW3Jbbl0uaWRlbnRpZmllcl0sbisrO3JldHVybiBhLmxlbmd0aD9bayhzLmNvbmNhdChhKSwiaWRlbnRpZmllciIsITApLGFdOnZvaWQgMH1mdW5jdGlvbiBxKCl7Ty5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHQ9cCh0aGlzLmhhbmRsZXIsdGhpcyk7dGhpcy50b3VjaD1uZXcgVih0aGlzLm1hbmFnZXIsdCksdGhpcy5tb3VzZT1uZXcgSCh0aGlzLm1hbmFnZXIsdCksdGhpcy5wcmltYXJ5VG91Y2g9bnVsbCx0aGlzLmxhc3RUb3VjaGVzPVtdfWZ1bmN0aW9uIFgodCxlKXt0JlR0Pyh0aGlzLnByaW1hcnlUb3VjaD1lLmNoYW5nZWRQb2ludGVyc1swXS5pZGVudGlmaWVyLFouY2FsbCh0aGlzLGUpKTp0JihQdHxJdCkmJlouY2FsbCh0aGlzLGUpfWZ1bmN0aW9uIFoodCl7dmFyIGU9dC5jaGFuZ2VkUG9pbnRlcnNbMF07aWYoZS5pZGVudGlmaWVyPT09dGhpcy5wcmltYXJ5VG91Y2gpe3ZhciBpPXt4OmUuY2xpZW50WCx5OmUuY2xpZW50WX07dGhpcy5sYXN0VG91Y2hlcy5wdXNoKGkpO3ZhciBvPXRoaXMubGFzdFRvdWNoZXMsbj1mdW5jdGlvbigpe3ZhciB0PW8uaW5kZXhPZihpKTt0Pi0xJiZvLnNwbGljZSh0LDEpfTtzZXRUaW1lb3V0KG4sZWUpfX1mdW5jdGlvbiBLKHQpe2Zvcih2YXIgZT10LnNyY0V2ZW50LmNsaWVudFgsaT10LnNyY0V2ZW50LmNsaWVudFksbz0wO288dGhpcy5sYXN0VG91Y2hlcy5sZW5ndGg7bysrKXt2YXIgbj10aGlzLmxhc3RUb3VjaGVzW29dLHM9TWF0aC5hYnMoZS1uLngpLHI9TWF0aC5hYnMoaS1uLnkpO2lmKHM8PWllJiZyPD1pZSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBKKHQsZSl7dGhpcy5tYW5hZ2VyPXQsdGhpcy5zZXQoZSl9ZnVuY3Rpb24gUSh0KXtpZihiKHQsYWUpKXJldHVybiBhZTt2YXIgZT1iKHQsaGUpLGk9Yih0LGRlKTtyZXR1cm4gZSYmaT9hZTplfHxpP2U/aGU6ZGU6Yih0LHJlKT9yZTpzZX1mdW5jdGlvbiAkKHQpe3RoaXMub3B0aW9ucz1mdCh7fSx0aGlzLmRlZmF1bHRzLHR8fHt9KSx0aGlzLmlkPVMoKSx0aGlzLm1hbmFnZXI9bnVsbCx0aGlzLm9wdGlvbnMuZW5hYmxlPW0odGhpcy5vcHRpb25zLmVuYWJsZSwhMCksdGhpcy5zdGF0ZT11ZSx0aGlzLnNpbXVsdGFuZW91cz17fSx0aGlzLnJlcXVpcmVGYWlsPVtdfWZ1bmN0aW9uIHR0KHQpe3JldHVybiB0JnZlPyJjYW5jZWwiOnQmZmU/ImVuZCI6dCZwZT8ibW92ZSI6dCZjZT8ic3RhcnQiOiIifWZ1bmN0aW9uIGV0KHQpe3JldHVybiB0PT1MdD8iZG93biI6dD09enQ/InVwIjp0PT1SdD8ibGVmdCI6dD09QXQ/InJpZ2h0IjoiIn1mdW5jdGlvbiBpdCh0LGUpe3ZhciBpPWUubWFuYWdlcjtyZXR1cm4gaT9pLmdldCh0KTp0fWZ1bmN0aW9uIG90KCl7JC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbnQoKXtvdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wWD1udWxsLHRoaXMucFk9bnVsbH1mdW5jdGlvbiBzdCgpe290LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBydCgpeyQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3RpbWVyPW51bGwsdGhpcy5faW5wdXQ9bnVsbH1mdW5jdGlvbiBhdCgpe290LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBodCgpe290LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBkdCgpeyQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucFRpbWU9ITEsdGhpcy5wQ2VudGVyPSExLHRoaXMuX3RpbWVyPW51bGwsdGhpcy5faW5wdXQ9bnVsbCx0aGlzLmNvdW50PTB9ZnVuY3Rpb24gbHQodCxlKXtyZXR1cm4gZT1lfHx7fSxlLnJlY29nbml6ZXJzPW0oZS5yZWNvZ25pemVycyxsdC5kZWZhdWx0cy5wcmVzZXQpLG5ldyB1dCh0LGUpfWZ1bmN0aW9uIHV0KHQsZSl7dGhpcy5vcHRpb25zPWZ0KHt9LGx0LmRlZmF1bHRzLGV8fHt9KSx0aGlzLm9wdGlvbnMuaW5wdXRUYXJnZXQ9dGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0fHx0LHRoaXMuaGFuZGxlcnM9e30sdGhpcy5zZXNzaW9uPXt9LHRoaXMucmVjb2duaXplcnM9W10sdGhpcy5vbGRDc3NQcm9wcz17fSx0aGlzLmVsZW1lbnQ9dCx0aGlzLmlucHV0PUModGhpcyksdGhpcy50b3VjaEFjdGlvbj1uZXcgSih0aGlzLHRoaXMub3B0aW9ucy50b3VjaEFjdGlvbiksY3QodGhpcywhMCksbCh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hZGQobmV3IHRbMF0odFsxXSkpO3RbMl0mJmUucmVjb2duaXplV2l0aCh0WzJdKSx0WzNdJiZlLnJlcXVpcmVGYWlsdXJlKHRbM10pfSx0aGlzKX1mdW5jdGlvbiBjdCh0LGUpe3ZhciBpPXQuZWxlbWVudDtpZihpLnN0eWxlKXt2YXIgbztsKHQub3B0aW9ucy5jc3NQcm9wcyxmdW5jdGlvbihuLHMpe289TShpLnN0eWxlLHMpLGU/KHQub2xkQ3NzUHJvcHNbb109aS5zdHlsZVtvXSxpLnN0eWxlW29dPW4pOmkuc3R5bGVbb109dC5vbGRDc3NQcm9wc1tvXXx8IiJ9KSxlfHwodC5vbGRDc3NQcm9wcz17fSl9fWZ1bmN0aW9uIHB0KHQsZSl7dmFyIGk9cy5jcmVhdGVFdmVudCgiRXZlbnQiKTtpLmluaXRFdmVudCh0LCEwLCEwKSxpLmdlc3R1cmU9ZSxlLnRhcmdldC5kaXNwYXRjaEV2ZW50KGkpfXZhciBmdCxtdD1bIiIsIndlYmtpdCIsIk1veiIsIk1TIiwibXMiLCJvIl0sdnQ9cy5jcmVhdGVFbGVtZW50KCJkaXYiKSxndD0iZnVuY3Rpb24iLHl0PU1hdGgucm91bmQsYnQ9TWF0aC5hYnMsX3Q9RGF0ZS5ub3c7ZnQ9ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24/ZnVuY3Rpb24odCl7aWYodD09PWF8fG51bGw9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpO2Zvcih2YXIgZT1PYmplY3QodCksaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBvPWFyZ3VtZW50c1tpXTtpZihvIT09YSYmbnVsbCE9PW8pZm9yKHZhciBuIGluIG8pby5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09b1tuXSl9cmV0dXJuIGV9Ok9iamVjdC5hc3NpZ247dmFyIHd0PXUoZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbz1PYmplY3Qua2V5cyhlKSxuPTA7bjxvLmxlbmd0aDspKCFpfHxpJiZ0W29bbl1dPT09YSkmJih0W29bbl1dPWVbb1tuXV0pLG4rKztyZXR1cm4gdH0sImV4dGVuZCIsIlVzZSBgYXNzaWduYC4iKSx4dD11KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHd0KHQsZSwhMCl9LCJtZXJnZSIsIlVzZSBgYXNzaWduYC4iKSxrdD0xLE10PS9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaSxTdD0ib250b3VjaHN0YXJ0ImluIG4sRHQ9TShuLCJQb2ludGVyRXZlbnQiKSE9PWEsT3Q9U3QmJk10LnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksQ3Q9MjUsVHQ9MSxFdD0yLFB0PTQsSXQ9OCxOdD0xLFJ0PTIsQXQ9NCx6dD04LEx0PTE2LEZ0PVJ0fEF0LEJ0PXp0fEx0LGp0PUZ0fEJ0LEh0PVsieCIsInkiXSxXdD1bImNsaWVudFgiLCJjbGllbnRZIl07Ty5wcm90b3R5cGU9e2hhbmRsZXI6ZnVuY3Rpb24oKXt9LGluaXQ6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJnYodGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJnYodGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJnYoRCh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZXZFbCYmZyh0aGlzLmVsZW1lbnQsdGhpcy5ldkVsLHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldlRhcmdldCYmZyh0aGlzLnRhcmdldCx0aGlzLmV2VGFyZ2V0LHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldldpbiYmZyhEKHRoaXMuZWxlbWVudCksdGhpcy5ldldpbix0aGlzLmRvbUhhbmRsZXIpfX07dmFyIFl0PXttb3VzZWRvd246VHQsbW91c2Vtb3ZlOkV0LG1vdXNldXA6UHR9LEd0PSJtb3VzZWRvd24iLFZ0PSJtb3VzZW1vdmUgbW91c2V1cCI7YyhILE8se2hhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9WXRbdC50eXBlXTtlJlR0JiYwPT09dC5idXR0b24mJih0aGlzLnByZXNzZWQ9ITApLGUmRXQmJjEhPT10LndoaWNoJiYoZT1QdCksdGhpcy5wcmVzc2VkJiYoZSZQdCYmKHRoaXMucHJlc3NlZD0hMSksdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsZSx7cG9pbnRlcnM6W3RdLGNoYW5nZWRQb2ludGVyczpbdF0scG9pbnRlclR5cGU6Im1vdXNlIixzcmNFdmVudDp0fSkpfX0pO3ZhciBVdD17cG9pbnRlcmRvd246VHQscG9pbnRlcm1vdmU6RXQscG9pbnRlcnVwOlB0LHBvaW50ZXJjYW5jZWw6SXQscG9pbnRlcm91dDpJdH0scXQ9ezI6InRvdWNoIiwzOiJwZW4iLDQ6Im1vdXNlIiw1OiJraW5lY3QifSxYdD0icG9pbnRlcmRvd24iLFp0PSJwb2ludGVybW92ZSBwb2ludGVydXAgcG9pbnRlcmNhbmNlbCI7bi5NU1BvaW50ZXJFdmVudCYmIW4uUG9pbnRlckV2ZW50JiYoWHQ9Ik1TUG9pbnRlckRvd24iLFp0PSJNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCIpLGMoVyxPLHtoYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3RvcmUsaT0hMSxvPXQudHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoIm1zIiwiIiksbj1VdFtvXSxzPXF0W3QucG9pbnRlclR5cGVdfHx0LnBvaW50ZXJUeXBlLHI9InRvdWNoIj09cyxhPXcoZSx0LnBvaW50ZXJJZCwicG9pbnRlcklkIik7biZUdCYmKDA9PT10LmJ1dHRvbnx8cik/YTwwJiYoZS5wdXNoKHQpLGE9ZS5sZW5ndGgtMSk6biYoUHR8SXQpJiYoaT0hMCksYTwwfHwoZVthXT10LHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLG4se3BvaW50ZXJzOmUsY2hhbmdlZFBvaW50ZXJzOlt0XSxwb2ludGVyVHlwZTpzLHNyY0V2ZW50OnR9KSxpJiZlLnNwbGljZShhLDEpKX19KTt2YXIgS3Q9e3RvdWNoc3RhcnQ6VHQsdG91Y2htb3ZlOkV0LHRvdWNoZW5kOlB0LHRvdWNoY2FuY2VsOkl0fSxKdD0idG91Y2hzdGFydCIsUXQ9InRvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsIjtjKFksTyx7aGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgZT1LdFt0LnR5cGVdO2lmKGU9PT1UdCYmKHRoaXMuc3RhcnRlZD0hMCksdGhpcy5zdGFydGVkKXt2YXIgaT1HLmNhbGwodGhpcyx0LGUpO2UmKFB0fEl0KSYmaVswXS5sZW5ndGgtaVsxXS5sZW5ndGg9PTAmJih0aGlzLnN0YXJ0ZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGUse3BvaW50ZXJzOmlbMF0sY2hhbmdlZFBvaW50ZXJzOmlbMV0scG9pbnRlclR5cGU6InRvdWNoIixzcmNFdmVudDp0fSl9fX0pO3ZhciAkdD17dG91Y2hzdGFydDpUdCx0b3VjaG1vdmU6RXQsdG91Y2hlbmQ6UHQsdG91Y2hjYW5jZWw6SXR9LHRlPSJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCI7YyhWLE8se2hhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9JHRbdC50eXBlXSxpPVUuY2FsbCh0aGlzLHQsZSk7aSYmdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsZSx7cG9pbnRlcnM6aVswXSxjaGFuZ2VkUG9pbnRlcnM6aVsxXSxwb2ludGVyVHlwZToidG91Y2giLHNyY0V2ZW50OnR9KX19KTt2YXIgZWU9MjUwMCxpZT0yNTtjKHEsTyx7aGFuZGxlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG89InRvdWNoIj09aS5wb2ludGVyVHlwZSxuPSJtb3VzZSI9PWkucG9pbnRlclR5cGU7aWYoIShuJiZpLnNvdXJjZUNhcGFiaWxpdGllcyYmaS5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50cykpe2lmKG8pWC5jYWxsKHRoaXMsZSxpKTtlbHNlIGlmKG4mJksuY2FsbCh0aGlzLGkpKXJldHVybjt0aGlzLmNhbGxiYWNrKHQsZSxpKX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnRvdWNoLmRlc3Ryb3koKSx0aGlzLm1vdXNlLmRlc3Ryb3koKX19KTt2YXIgb2U9TSh2dC5zdHlsZSwidG91Y2hBY3Rpb24iKSxuZT1vZSE9PWEsc2U9ImF1dG8iLHJlPSJtYW5pcHVsYXRpb24iLGFlPSJub25lIixoZT0icGFuLXgiLGRlPSJwYW4teSIsbGU9ZnVuY3Rpb24oKXtpZighbmUpcmV0dXJuITE7dmFyIHQ9e30sZT1uLkNTUyYmbi5DU1Muc3VwcG9ydHMKO3JldHVyblsiYXV0byIsIm1hbmlwdWxhdGlvbiIsInBhbi15IiwicGFuLXgiLCJwYW4teCBwYW4teSIsIm5vbmUiXS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3RbaV09IWV8fG4uQ1NTLnN1cHBvcnRzKCJ0b3VjaC1hY3Rpb24iLGkpfSksdH0oKTtKLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKHQpeyJjb21wdXRlIj09dCYmKHQ9dGhpcy5jb21wdXRlKCkpLG5lJiZ0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZSYmbGVbdF0mJih0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZVtvZV09dCksdGhpcy5hY3Rpb25zPXQudG9Mb3dlckNhc2UoKS50cmltKCl9LHVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuc2V0KHRoaXMubWFuYWdlci5vcHRpb25zLnRvdWNoQWN0aW9uKX0sY29tcHV0ZTpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiBsKHRoaXMubWFuYWdlci5yZWNvZ25pemVycyxmdW5jdGlvbihlKXtmKGUub3B0aW9ucy5lbmFibGUsW2VdKSYmKHQ9dC5jb25jYXQoZS5nZXRUb3VjaEFjdGlvbigpKSl9KSxRKHQuam9pbigiICIpKX0scHJldmVudERlZmF1bHRzOmZ1bmN0aW9uKHQpe3ZhciBlPXQuc3JjRXZlbnQsaT10Lm9mZnNldERpcmVjdGlvbjtpZih0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQpcmV0dXJuIHZvaWQgZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBvPXRoaXMuYWN0aW9ucyxuPWIobyxhZSkmJiFsZVthZV0scz1iKG8sZGUpJiYhbGVbZGVdLHI9YihvLGhlKSYmIWxlW2hlXTtpZihuKXt2YXIgYT0xPT09dC5wb2ludGVycy5sZW5ndGgsaD10LmRpc3RhbmNlPDIsZD10LmRlbHRhVGltZTwyNTA7aWYoYSYmaCYmZClyZXR1cm59cmV0dXJuIHImJnM/dm9pZCAwOm58fHMmJmkmRnR8fHImJmkmQnQ/dGhpcy5wcmV2ZW50U3JjKGUpOnZvaWQgMH0scHJldmVudFNyYzpmdW5jdGlvbih0KXt0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQ9ITAsdC5wcmV2ZW50RGVmYXVsdCgpfX07dmFyIHVlPTEsY2U9MixwZT00LGZlPTgsbWU9ZmUsdmU9MTY7JC5wcm90b3R5cGU9e2RlZmF1bHRzOnt9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gZnQodGhpcy5vcHRpb25zLHQpLHRoaXMubWFuYWdlciYmdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpLHRoaXN9LHJlY29nbml6ZVdpdGg6ZnVuY3Rpb24odCl7aWYoZCh0LCJyZWNvZ25pemVXaXRoIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLnNpbXVsdGFuZW91cztyZXR1cm4gdD1pdCh0LHRoaXMpLGVbdC5pZF18fChlW3QuaWRdPXQsdC5yZWNvZ25pemVXaXRoKHRoaXMpKSx0aGlzfSxkcm9wUmVjb2duaXplV2l0aDpmdW5jdGlvbih0KXtyZXR1cm4gZCh0LCJkcm9wUmVjb2duaXplV2l0aCIsdGhpcyk/dGhpczoodD1pdCh0LHRoaXMpLGRlbGV0ZSB0aGlzLnNpbXVsdGFuZW91c1t0LmlkXSx0aGlzKX0scmVxdWlyZUZhaWx1cmU6ZnVuY3Rpb24odCl7aWYoZCh0LCJyZXF1aXJlRmFpbHVyZSIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5yZXF1aXJlRmFpbDtyZXR1cm4gdD1pdCh0LHRoaXMpLC0xPT09dyhlLHQpJiYoZS5wdXNoKHQpLHQucmVxdWlyZUZhaWx1cmUodGhpcykpLHRoaXN9LGRyb3BSZXF1aXJlRmFpbHVyZTpmdW5jdGlvbih0KXtpZihkKHQsImRyb3BSZXF1aXJlRmFpbHVyZSIsdGhpcykpcmV0dXJuIHRoaXM7dD1pdCh0LHRoaXMpO3ZhciBlPXcodGhpcy5yZXF1aXJlRmFpbCx0KTtyZXR1cm4gZT4tMSYmdGhpcy5yZXF1aXJlRmFpbC5zcGxpY2UoZSwxKSx0aGlzfSxoYXNSZXF1aXJlRmFpbHVyZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg+MH0sY2FuUmVjb2duaXplV2l0aDpmdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuc2ltdWx0YW5lb3VzW3QuaWRdfSxlbWl0OmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7aS5tYW5hZ2VyLmVtaXQoZSx0KX12YXIgaT10aGlzLG89dGhpcy5zdGF0ZTtvPGZlJiZlKGkub3B0aW9ucy5ldmVudCt0dChvKSksZShpLm9wdGlvbnMuZXZlbnQpLHQuYWRkaXRpb25hbEV2ZW50JiZlKHQuYWRkaXRpb25hbEV2ZW50KSxvPj1mZSYmZShpLm9wdGlvbnMuZXZlbnQrdHQobykpfSx0cnlFbWl0OmZ1bmN0aW9uKHQpe2lmKHRoaXMuY2FuRW1pdCgpKXJldHVybiB0aGlzLmVtaXQodCk7dGhpcy5zdGF0ZT0zMn0sY2FuRW1pdDpmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg7KXtpZighKHRoaXMucmVxdWlyZUZhaWxbdF0uc3RhdGUmKDMyfHVlKSkpcmV0dXJuITE7dCsrfXJldHVybiEwfSxyZWNvZ25pemU6ZnVuY3Rpb24odCl7dmFyIGU9ZnQoe30sdCk7aWYoIWYodGhpcy5vcHRpb25zLmVuYWJsZSxbdGhpcyxlXSkpcmV0dXJuIHRoaXMucmVzZXQoKSx2b2lkKHRoaXMuc3RhdGU9MzIpO3RoaXMuc3RhdGUmKG1lfHZlfDMyKSYmKHRoaXMuc3RhdGU9dWUpLHRoaXMuc3RhdGU9dGhpcy5wcm9jZXNzKGUpLHRoaXMuc3RhdGUmKGNlfHBlfGZlfHZlKSYmdGhpcy50cnlFbWl0KGUpfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe30sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt9LHJlc2V0OmZ1bmN0aW9uKCl7fX0sYyhvdCwkLHtkZWZhdWx0czp7cG9pbnRlcnM6MX0sYXR0clRlc3Q6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLnBvaW50ZXJzO3JldHVybiAwPT09ZXx8dC5wb2ludGVycy5sZW5ndGg9PT1lfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3RhdGUsaT10LmV2ZW50VHlwZSxvPWUmKGNlfHBlKSxuPXRoaXMuYXR0clRlc3QodCk7cmV0dXJuIG8mJihpJkl0fHwhbik/ZXx2ZTpvfHxuP2kmUHQ/ZXxmZTplJmNlP2V8cGU6Y2U6MzJ9fSksYyhudCxvdCx7ZGVmYXVsdHM6e2V2ZW50OiJwYW4iLHRocmVzaG9sZDoxMCxwb2ludGVyczoxLGRpcmVjdGlvbjpqdH0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuZGlyZWN0aW9uLGU9W107cmV0dXJuIHQmRnQmJmUucHVzaChkZSksdCZCdCYmZS5wdXNoKGhlKSxlfSxkaXJlY3Rpb25UZXN0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucyxpPSEwLG89dC5kaXN0YW5jZSxuPXQuZGlyZWN0aW9uLHM9dC5kZWx0YVgscj10LmRlbHRhWTtyZXR1cm4gbiZlLmRpcmVjdGlvbnx8KGUuZGlyZWN0aW9uJkZ0PyhuPTA9PT1zP050OnM8MD9SdDpBdCxpPXMhPXRoaXMucFgsbz1NYXRoLmFicyh0LmRlbHRhWCkpOihuPTA9PT1yP050OnI8MD96dDpMdCxpPXIhPXRoaXMucFksbz1NYXRoLmFicyh0LmRlbHRhWSkpKSx0LmRpcmVjdGlvbj1uLGkmJm8+ZS50aHJlc2hvbGQmJm4mZS5kaXJlY3Rpb259LGF0dHJUZXN0OmZ1bmN0aW9uKHQpe3JldHVybiBvdC5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLHQpJiYodGhpcy5zdGF0ZSZjZXx8ISh0aGlzLnN0YXRlJmNlKSYmdGhpcy5kaXJlY3Rpb25UZXN0KHQpKX0sZW1pdDpmdW5jdGlvbih0KXt0aGlzLnBYPXQuZGVsdGFYLHRoaXMucFk9dC5kZWx0YVk7dmFyIGU9ZXQodC5kaXJlY3Rpb24pO2UmJih0LmFkZGl0aW9uYWxFdmVudD10aGlzLm9wdGlvbnMuZXZlbnQrZSksdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsdCl9fSksYyhzdCxvdCx7ZGVmYXVsdHM6e2V2ZW50OiJwaW5jaCIsdGhyZXNob2xkOjAscG9pbnRlcnM6Mn0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm5bYWVdfSxhdHRyVGVzdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLHQpJiYoTWF0aC5hYnModC5zY2FsZS0xKT50aGlzLm9wdGlvbnMudGhyZXNob2xkfHx0aGlzLnN0YXRlJmNlKX0sZW1pdDpmdW5jdGlvbih0KXtpZigxIT09dC5zY2FsZSl7dmFyIGU9dC5zY2FsZTwxPyJpbiI6Im91dCI7dC5hZGRpdGlvbmFsRXZlbnQ9dGhpcy5vcHRpb25zLmV2ZW50K2V9dGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsdCl9fSksYyhydCwkLHtkZWZhdWx0czp7ZXZlbnQ6InByZXNzIixwb2ludGVyczoxLHRpbWU6MjUxLHRocmVzaG9sZDo5fSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltzZV19LHByb2Nlc3M6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLGk9dC5wb2ludGVycy5sZW5ndGg9PT1lLnBvaW50ZXJzLG89dC5kaXN0YW5jZTxlLnRocmVzaG9sZCxuPXQuZGVsdGFUaW1lPmUudGltZTtpZih0aGlzLl9pbnB1dD10LCFvfHwhaXx8dC5ldmVudFR5cGUmKFB0fEl0KSYmIW4pdGhpcy5yZXNldCgpO2Vsc2UgaWYodC5ldmVudFR5cGUmVHQpdGhpcy5yZXNldCgpLHRoaXMuX3RpbWVyPWgoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPW1lLHRoaXMudHJ5RW1pdCgpfSxlLnRpbWUsdGhpcyk7ZWxzZSBpZih0LmV2ZW50VHlwZSZQdClyZXR1cm4gbWU7cmV0dXJuIDMyfSxyZXNldDpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLl90aW1lcil9LGVtaXQ6ZnVuY3Rpb24odCl7dGhpcy5zdGF0ZT09PW1lJiYodCYmdC5ldmVudFR5cGUmUHQ/dGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50KyJ1cCIsdCk6KHRoaXMuX2lucHV0LnRpbWVTdGFtcD1fdCgpLHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCx0aGlzLl9pbnB1dCkpKX19KSxjKGF0LG90LHtkZWZhdWx0czp7ZXZlbnQ6InJvdGF0ZSIsdGhyZXNob2xkOjAscG9pbnRlcnM6Mn0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm5bYWVdfSxhdHRyVGVzdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLHQpJiYoTWF0aC5hYnModC5yb3RhdGlvbik+dGhpcy5vcHRpb25zLnRocmVzaG9sZHx8dGhpcy5zdGF0ZSZjZSl9fSksYyhodCxvdCx7ZGVmYXVsdHM6e2V2ZW50OiJzd2lwZSIsdGhyZXNob2xkOjEwLHZlbG9jaXR5Oi4zLGRpcmVjdGlvbjpGdHxCdCxwb2ludGVyczoxfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybiBudC5wcm90b3R5cGUuZ2V0VG91Y2hBY3Rpb24uY2FsbCh0aGlzKX0sYXR0clRlc3Q6ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uO3JldHVybiBpJihGdHxCdCk/ZT10Lm92ZXJhbGxWZWxvY2l0eTppJkZ0P2U9dC5vdmVyYWxsVmVsb2NpdHlYOmkmQnQmJihlPXQub3ZlcmFsbFZlbG9jaXR5WSksdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLHQpJiZpJnQub2Zmc2V0RGlyZWN0aW9uJiZ0LmRpc3RhbmNlPnRoaXMub3B0aW9ucy50aHJlc2hvbGQmJnQubWF4UG9pbnRlcnM9PXRoaXMub3B0aW9ucy5wb2ludGVycyYmYnQoZSk+dGhpcy5vcHRpb25zLnZlbG9jaXR5JiZ0LmV2ZW50VHlwZSZQdH0sZW1pdDpmdW5jdGlvbih0KXt2YXIgZT1ldCh0Lm9mZnNldERpcmVjdGlvbik7ZSYmdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50K2UsdCksdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHQpfX0pLGMoZHQsJCx7ZGVmYXVsdHM6e2V2ZW50OiJ0YXAiLHBvaW50ZXJzOjEsdGFwczoxLGludGVydmFsOjMwMCx0aW1lOjI1MCx0aHJlc2hvbGQ6OSxwb3NUaHJlc2hvbGQ6MTB9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW3JlXX0scHJvY2VzczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMsaT10LnBvaW50ZXJzLmxlbmd0aD09PWUucG9pbnRlcnMsbz10LmRpc3RhbmNlPGUudGhyZXNob2xkLG49dC5kZWx0YVRpbWU8ZS50aW1lO2lmKHRoaXMucmVzZXQoKSx0LmV2ZW50VHlwZSZUdCYmMD09PXRoaXMuY291bnQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtpZihvJiZuJiZpKXtpZih0LmV2ZW50VHlwZSE9UHQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTt2YXIgcz0hdGhpcy5wVGltZXx8dC50aW1lU3RhbXAtdGhpcy5wVGltZTxlLmludGVydmFsLHI9IXRoaXMucENlbnRlcnx8TCh0aGlzLnBDZW50ZXIsdC5jZW50ZXIpPGUucG9zVGhyZXNob2xkO3RoaXMucFRpbWU9dC50aW1lU3RhbXAsdGhpcy5wQ2VudGVyPXQuY2VudGVyLHImJnM/dGhpcy5jb3VudCs9MTp0aGlzLmNvdW50PTEsdGhpcy5faW5wdXQ9dDtpZigwPT09dGhpcy5jb3VudCVlLnRhcHMpcmV0dXJuIHRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCk/KHRoaXMuX3RpbWVyPWgoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPW1lLHRoaXMudHJ5RW1pdCgpfSxlLmludGVydmFsLHRoaXMpLGNlKTptZX1yZXR1cm4gMzJ9LGZhaWxUaW1lb3V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpbWVyPWgoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPTMyfSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwsdGhpcyksMzJ9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbigpe3RoaXMuc3RhdGU9PW1lJiYodGhpcy5faW5wdXQudGFwQ291bnQ9dGhpcy5jb3VudCx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdGhpcy5faW5wdXQpKX19KSxsdC5WRVJTSU9OPSIyLjAuNyIsbHQuZGVmYXVsdHM9e2RvbUV2ZW50czohMSx0b3VjaEFjdGlvbjoiY29tcHV0ZSIsZW5hYmxlOiEwLGlucHV0VGFyZ2V0Om51bGwsaW5wdXRDbGFzczpudWxsLHByZXNldDpbW2F0LHtlbmFibGU6ITF9XSxbc3Qse2VuYWJsZTohMX0sWyJyb3RhdGUiXV0sW2h0LHtkaXJlY3Rpb246RnR9XSxbbnQse2RpcmVjdGlvbjpGdH0sWyJzd2lwZSJdXSxbZHRdLFtkdCx7ZXZlbnQ6ImRvdWJsZXRhcCIsdGFwczoyfSxbInRhcCJdXSxbcnRdXSxjc3NQcm9wczp7dXNlclNlbGVjdDoibm9uZSIsdG91Y2hTZWxlY3Q6Im5vbmUiLHRvdWNoQ2FsbG91dDoibm9uZSIsY29udGVudFpvb21pbmc6Im5vbmUiLHVzZXJEcmFnOiJub25lIix0YXBIaWdobGlnaHRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fTt1dC5wcm90b3R5cGU9e3NldDpmdW5jdGlvbih0KXtyZXR1cm4gZnQodGhpcy5vcHRpb25zLHQpLHQudG91Y2hBY3Rpb24mJnRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksdC5pbnB1dFRhcmdldCYmKHRoaXMuaW5wdXQuZGVzdHJveSgpLHRoaXMuaW5wdXQudGFyZ2V0PXQuaW5wdXRUYXJnZXQsdGhpcy5pbnB1dC5pbml0KCkpLHRoaXN9LHN0b3A6ZnVuY3Rpb24odCl7dGhpcy5zZXNzaW9uLnN0b3BwZWQ9dD8yOjF9LHJlY29nbml6ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnNlc3Npb247aWYoIWUuc3RvcHBlZCl7dGhpcy50b3VjaEFjdGlvbi5wcmV2ZW50RGVmYXVsdHModCk7dmFyIGksbz10aGlzLnJlY29nbml6ZXJzLG49ZS5jdXJSZWNvZ25pemVyOyghbnx8biYmbi5zdGF0ZSZtZSkmJihuPWUuY3VyUmVjb2duaXplcj1udWxsKTtmb3IodmFyIHM9MDtzPG8ubGVuZ3RoOylpPW9bc10sMj09PWUuc3RvcHBlZHx8biYmaSE9biYmIWkuY2FuUmVjb2duaXplV2l0aChuKT9pLnJlc2V0KCk6aS5yZWNvZ25pemUodCksIW4mJmkuc3RhdGUmKGNlfHBlfGZlKSYmKG49ZS5jdXJSZWNvZ25pemVyPWkpLHMrK319LGdldDpmdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgJClyZXR1cm4gdDtmb3IodmFyIGU9dGhpcy5yZWNvZ25pemVycyxpPTA7aTxlLmxlbmd0aDtpKyspaWYoZVtpXS5vcHRpb25zLmV2ZW50PT10KXJldHVybiBlW2ldO3JldHVybiBudWxsfSxhZGQ6ZnVuY3Rpb24odCl7aWYoZCh0LCJhZGQiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBlPXRoaXMuZ2V0KHQub3B0aW9ucy5ldmVudCk7cmV0dXJuIGUmJnRoaXMucmVtb3ZlKGUpLHRoaXMucmVjb2duaXplcnMucHVzaCh0KSx0Lm1hbmFnZXI9dGhpcyx0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpLHR9LHJlbW92ZTpmdW5jdGlvbih0KXtpZihkKHQsInJlbW92ZSIsdGhpcykpcmV0dXJuIHRoaXM7aWYodD10aGlzLmdldCh0KSl7dmFyIGU9dGhpcy5yZWNvZ25pemVycyxpPXcoZSx0KTstMSE9PWkmJihlLnNwbGljZShpLDEpLHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCkpfXJldHVybiB0aGlzfSxvbjpmdW5jdGlvbih0LGUpe2lmKHQhPT1hJiZlIT09YSl7dmFyIGk9dGhpcy5oYW5kbGVycztyZXR1cm4gbChfKHQpLGZ1bmN0aW9uKHQpe2lbdF09aVt0XXx8W10saVt0XS5wdXNoKGUpfSksdGhpc319LG9mZjpmdW5jdGlvbih0LGUpe2lmKHQhPT1hKXt2YXIgaT10aGlzLmhhbmRsZXJzO3JldHVybiBsKF8odCksZnVuY3Rpb24odCl7ZT9pW3RdJiZpW3RdLnNwbGljZSh3KGlbdF0sZSksMSk6ZGVsZXRlIGlbdF19KSx0aGlzfX0sZW1pdDpmdW5jdGlvbih0LGUpe3RoaXMub3B0aW9ucy5kb21FdmVudHMmJnB0KHQsZSk7dmFyIGk9dGhpcy5oYW5kbGVyc1t0XSYmdGhpcy5oYW5kbGVyc1t0XS5zbGljZSgpO2lmKGkmJmkubGVuZ3RoKXtlLnR5cGU9dCxlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7ZS5zcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpfTtmb3IodmFyIG89MDtvPGkubGVuZ3RoOylpW29dKGUpLG8rK319LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQmJmN0KHRoaXMsITEpLHRoaXMuaGFuZGxlcnM9e30sdGhpcy5zZXNzaW9uPXt9LHRoaXMuaW5wdXQuZGVzdHJveSgpLHRoaXMuZWxlbWVudD1udWxsfX0sZnQobHQse0lOUFVUX1NUQVJUOlR0LElOUFVUX01PVkU6RXQsSU5QVVRfRU5EOlB0LElOUFVUX0NBTkNFTDpJdCxTVEFURV9QT1NTSUJMRTp1ZSxTVEFURV9CRUdBTjpjZSxTVEFURV9DSEFOR0VEOnBlLFNUQVRFX0VOREVEOmZlLFNUQVRFX1JFQ09HTklaRUQ6bWUsU1RBVEVfQ0FOQ0VMTEVEOnZlLFNUQVRFX0ZBSUxFRDozMixESVJFQ1RJT05fTk9ORTpOdCxESVJFQ1RJT05fTEVGVDpSdCxESVJFQ1RJT05fUklHSFQ6QXQsRElSRUNUSU9OX1VQOnp0LERJUkVDVElPTl9ET1dOOkx0LERJUkVDVElPTl9IT1JJWk9OVEFMOkZ0LERJUkVDVElPTl9WRVJUSUNBTDpCdCxESVJFQ1RJT05fQUxMOmp0LE1hbmFnZXI6dXQsSW5wdXQ6TyxUb3VjaEFjdGlvbjpKLFRvdWNoSW5wdXQ6VixNb3VzZUlucHV0OkgsUG9pbnRlckV2ZW50SW5wdXQ6VyxUb3VjaE1vdXNlSW5wdXQ6cSxTaW5nbGVUb3VjaElucHV0OlksUmVjb2duaXplcjokLEF0dHJSZWNvZ25pemVyOm90LFRhcDpkdCxQYW46bnQsU3dpcGU6aHQsUGluY2g6c3QsUm90YXRlOmF0LFByZXNzOnJ0LG9uOnYsb2ZmOmcsZWFjaDpsLG1lcmdlOnh0LGV4dGVuZDp3dCxhc3NpZ246ZnQsaW5oZXJpdDpjLGJpbmRGbjpwLHByZWZpeGVkOk19KSwodm9pZCAwIT09bj9uOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9KS5IYW1tZXI9bHQsKG89ZnVuY3Rpb24oKXtyZXR1cm4gbHR9LmNhbGwoZSxpLGUsdCkpIT09YSYmKHQuZXhwb3J0cz1vKX0od2luZG93LGRvY3VtZW50KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvLG4sczshZnVuY3Rpb24oaSxyKXtuPVtdLG89cix2b2lkIDAhPT0ocz0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vLmFwcGx5KGUsbik6bykmJih0LmV4cG9ydHM9cyl9KDAsZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlLGk9dCYmdC5wcmV2ZW50RGVmYXVsdHx8ITEsbz10JiZ0LmNvbnRhaW5lcnx8d2luZG93LG49e30scz17a2V5ZG93bjp7fSxrZXl1cDp7fX0scj17fTtmb3IoZT05NztlPD0xMjI7ZSsrKXJbU3RyaW5nLmZyb21DaGFyQ29kZShlKV09e2NvZGU6ZS05Nys2NSxzaGlmdDohMX07Zm9yKGU9NjU7ZTw9OTA7ZSsrKXJbU3RyaW5nLmZyb21DaGFyQ29kZShlKV09e2NvZGU6ZSxzaGlmdDohMH07Zm9yKGU9MDtlPD05O2UrKylyWyIiK2VdPXtjb2RlOjQ4K2Usc2hpZnQ6ITF9O2ZvcihlPTE7ZTw9MTI7ZSsrKXJbIkYiK2VdPXtjb2RlOjExMStlLHNoaWZ0OiExfTtmb3IoZT0wO2U8PTk7ZSsrKXJbIm51bSIrZV09e2NvZGU6OTYrZSxzaGlmdDohMX07clsibnVtKiJdPXtjb2RlOjEwNixzaGlmdDohMX0sclsibnVtKyJdPXtjb2RlOjEwNyxzaGlmdDohMX0sclsibnVtLSJdPXtjb2RlOjEwOSxzaGlmdDohMX0sclsibnVtLyJdPXtjb2RlOjExMSxzaGlmdDohMX0sclsibnVtLiJdPXtjb2RlOjExMCxzaGlmdDohMX0sci5sZWZ0PXtjb2RlOjM3LHNoaWZ0OiExfSxyLnVwPXtjb2RlOjM4LHNoaWZ0OiExfSxyLnJpZ2h0PXtjb2RlOjM5LHNoaWZ0OiExfSxyLmRvd249e2NvZGU6NDAsc2hpZnQ6ITF9LHIuc3BhY2U9e2NvZGU6MzIsc2hpZnQ6ITF9LHIuZW50ZXI9e2NvZGU6MTMsc2hpZnQ6ITF9LHIuc2hpZnQ9e2NvZGU6MTYsc2hpZnQ6dm9pZCAwfSxyLmVzYz17Y29kZToyNyxzaGlmdDohMX0sci5iYWNrc3BhY2U9e2NvZGU6OCxzaGlmdDohMX0sci50YWI9e2NvZGU6OSxzaGlmdDohMX0sci5jdHJsPXtjb2RlOjE3LHNoaWZ0OiExfSxyLmFsdD17Y29kZToxOCxzaGlmdDohMX0sci5kZWxldGU9e2NvZGU6NDYsc2hpZnQ6ITF9LHIucGFnZXVwPXtjb2RlOjMzLHNoaWZ0OiExfSxyLnBhZ2Vkb3duPXtjb2RlOjM0LHNoaWZ0OiExfSxyWyI9Il09e2NvZGU6MTg3LHNoaWZ0OiExfSxyWyItIl09e2NvZGU6MTg5LHNoaWZ0OiExfSxyWyJdIl09e2NvZGU6MjIxLHNoaWZ0OiExfSxyWyJbIl09e2NvZGU6MjE5LHNoaWZ0OiExfTt2YXIgYT1mdW5jdGlvbih0KXtkKHQsImtleWRvd24iKX0saD1mdW5jdGlvbih0KXtkKHQsImtleXVwIil9LGQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1zW2VdW3Qua2V5Q29kZV0pe2Zvcih2YXIgbz1zW2VdW3Qua2V5Q29kZV0sbj0wO248by5sZW5ndGg7bisrKXZvaWQgMD09PW9bbl0uc2hpZnQ/b1tuXS5mbih0KToxPT1vW25dLnNoaWZ0JiYxPT10LnNoaWZ0S2V5P29bbl0uZm4odCk6MD09b1tuXS5zaGlmdCYmMD09dC5zaGlmdEtleSYmb1tuXS5mbih0KTsxPT1pJiZ0LnByZXZlbnREZWZhdWx0KCl9fTtyZXR1cm4gbi5iaW5kPWZ1bmN0aW9uKHQsZSxpKXtpZih2b2lkIDA9PT1pJiYoaT0ia2V5ZG93biIpLHZvaWQgMD09PXJbdF0pdGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCBrZXk6ICIrdCk7dm9pZCAwPT09c1tpXVtyW3RdLmNvZGVdJiYoc1tpXVtyW3RdLmNvZGVdPVtdKSxzW2ldW3JbdF0uY29kZV0ucHVzaCh7Zm46ZSxzaGlmdDpyW3RdLnNoaWZ0fSl9LG4uYmluZEFsbD1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPSJrZXlkb3duIik7Zm9yKHZhciBpIGluIHIpci5oYXNPd25Qcm9wZXJ0eShpKSYmbi5iaW5kKGksdCxlKX0sbi5nZXRLZXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHIpaWYoci5oYXNPd25Qcm9wZXJ0eShlKSl7aWYoMT09dC5zaGlmdEtleSYmMT09cltlXS5zaGlmdCYmdC5rZXlDb2RlPT1yW2VdLmNvZGUpcmV0dXJuIGU7aWYoMD09dC5zaGlmdEtleSYmMD09cltlXS5zaGlmdCYmdC5rZXlDb2RlPT1yW2VdLmNvZGUpcmV0dXJuIGU7aWYodC5rZXlDb2RlPT1yW2VdLmNvZGUmJiJzaGlmdCI9PWUpcmV0dXJuIGV9cmV0dXJuInVua25vd24ga2V5LCBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCJ9LG4udW5iaW5kPWZ1bmN0aW9uKHQsZSxpKXtpZih2b2lkIDA9PT1pJiYoaT0ia2V5ZG93biIpLHZvaWQgMD09PXJbdF0pdGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCBrZXk6ICIrdCk7aWYodm9pZCAwIT09ZSl7dmFyIG89W10sbj1zW2ldW3JbdF0uY29kZV07aWYodm9pZCAwIT09bilmb3IodmFyIGE9MDthPG4ubGVuZ3RoO2ErKyluW2FdLmZuPT1lJiZuW2FdLnNoaWZ0PT1yW3RdLnNoaWZ0fHxvLnB1c2goc1tpXVtyW3RdLmNvZGVdW2FdKTtzW2ldW3JbdF0uY29kZV09b31lbHNlIHNbaV1bclt0XS5jb2RlXT1bXX0sbi5yZXNldD1mdW5jdGlvbigpe3M9e2tleWRvd246e30sa2V5dXA6e319fSxuLmRlc3Ryb3k9ZnVuY3Rpb24oKXtzPXtrZXlkb3duOnt9LGtleXVwOnt9fSxvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLGEsITApLG8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLGgsITApfSxvLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGEsITApLG8uYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLGgsITApLG59cmV0dXJuIHR9KX0sZnVuY3Rpb24odCxlLGkpe2UudXRpbD1pKDEpLGUuRE9NdXRpbD1pKDg4KSxlLkRhdGFTZXQ9aSg4OSksZS5EYXRhVmlldz1pKDkzKSxlLlF1ZXVlPWkoOTIpLGUuVGltZWxpbmU9aSgxMTcpLGUuR3JhcGgyZD1pKDE0OCksZS50aW1lbGluZT17Q29yZTppKDEyMiksRGF0ZVV0aWw6aSgxMjEpLFJhbmdlOmkoMTE4KSxzdGFjazppKDEyNiksVGltZVN0ZXA6aSgxMjQpLGNvbXBvbmVudHM6e2l0ZW1zOntJdGVtOmkoMTI4KSxCYWNrZ3JvdW5kSXRlbTppKDEzMiksQm94SXRlbTppKDEzMCksUG9pbnRJdGVtOmkoMTMxKSxSYW5nZUl0ZW06aSgxMjcpfSxCYWNrZ3JvdW5kR3JvdXA6aSgxMjkpLENvbXBvbmVudDppKDEyMCksQ3VycmVudFRpbWU6aSgxNDMpLEN1c3RvbVRpbWU6aSgxNDEpLERhdGFBeGlzOmkoMTUwKSxEYXRhU2NhbGU6aSgxNTEpLEdyYXBoR3JvdXA6aSgxNTIpLEdyb3VwOmkoMTI1KSxJdGVtU2V0OmkoMTIzKSxMZWdlbmQ6aSgxNTYpLExpbmVHcmFwaDppKDE0OSksVGltZUF4aXM6aSgxMzkpfX0sZS5tb21lbnQ9aSg4MiksZS5IYW1tZXI9aSgxMTIpLGUua2V5Y2hhcm09aSgxMTUpfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSxkKXtpZighKHRoaXMgaW5zdGFuY2VvZiBvKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO2lmKCEoQXJyYXkuaXNBcnJheShpKXx8aSBpbnN0YW5jZW9mIHJ8fGkgaW5zdGFuY2VvZiBhKSYmaSBpbnN0YW5jZW9mIE9iamVjdCl7dmFyIGM9ZDtkPWksaT1jfWQmJmQudGhyb3R0bGVSZWRyYXcmJmNvbnNvbGUud2FybignVGltZWxpbmUgb3B0aW9uICJ0aHJvdHRsZVJlZHJhdyIgaXMgREVQUklDQVRFRCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IE1BSk9SIHJlbGVhc2UuJyk7dmFyIGY9dGhpcztpZih0aGlzLmRlZmF1bHRPcHRpb25zPXtzdGFydDpudWxsLGVuZDpudWxsLGF1dG9SZXNpemU6ITAsb3JpZW50YXRpb246e2F4aXM6ImJvdHRvbSIsaXRlbToiYm90dG9tIn0sbW9tZW50Om4sd2lkdGg6bnVsbCxoZWlnaHQ6bnVsbCxtYXhIZWlnaHQ6bnVsbCxtaW5IZWlnaHQ6bnVsbH0sdGhpcy5vcHRpb25zPXMuZGVlcEV4dGVuZCh7fSx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLl9jcmVhdGUodCksIWR8fGQmJnZvaWQgMD09PWQucnRsKXtmb3IodmFyIG0sdj10aGlzLmRvbS5yb290OyFtJiZ2OyltPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHYsbnVsbCkuZGlyZWN0aW9uLHY9di5wYXJlbnRFbGVtZW50O3RoaXMub3B0aW9ucy5ydGw9bSYmInJ0bCI9PW0udG9Mb3dlckNhc2UoKX1lbHNlIHRoaXMub3B0aW9ucy5ydGw9ZC5ydGw7dGhpcy5vcHRpb25zLnJvbGxpbmdNb2RlPWQmJmQucm9sbGluZ01vZGUsdGhpcy5jb21wb25lbnRzPVtdLHRoaXMuYm9keT17ZG9tOnRoaXMuZG9tLGRvbVByb3BzOnRoaXMucHJvcHMsZW1pdHRlcjp7b246dGhpcy5vbi5iaW5kKHRoaXMpLG9mZjp0aGlzLm9mZi5iaW5kKHRoaXMpLGVtaXQ6dGhpcy5lbWl0LmJpbmQodGhpcyl9LGhpZGRlbkRhdGVzOltdLHV0aWw6e2dldFNjYWxlOmZ1bmN0aW9uKCl7cmV0dXJuIGYudGltZUF4aXMuc3RlcC5zY2FsZX0sZ2V0U3RlcDpmdW5jdGlvbigpe3JldHVybiBmLnRpbWVBeGlzLnN0ZXAuc3RlcH0sdG9TY3JlZW46Zi5fdG9TY3JlZW4uYmluZChmKSx0b0dsb2JhbFNjcmVlbjpmLl90b0dsb2JhbFNjcmVlbi5iaW5kKGYpLHRvVGltZTpmLl90b1RpbWUuYmluZChmKSx0b0dsb2JhbFRpbWU6Zi5fdG9HbG9iYWxUaW1lLmJpbmQoZil9fSx0aGlzLnJhbmdlPW5ldyBoKHRoaXMuYm9keSx0aGlzLm9wdGlvbnMpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMucmFuZ2UpLHRoaXMuYm9keS5yYW5nZT10aGlzLnJhbmdlLHRoaXMudGltZUF4aXM9bmV3IGwodGhpcy5ib2R5LHRoaXMub3B0aW9ucyksdGhpcy50aW1lQXhpczI9bnVsbCx0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLnRpbWVBeGlzKSx0aGlzLmN1cnJlbnRUaW1lPW5ldyB1KHRoaXMuYm9keSx0aGlzLm9wdGlvbnMpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMuY3VycmVudFRpbWUpLHRoaXMuaXRlbVNldD1uZXcgcCh0aGlzLmJvZHksdGhpcy5vcHRpb25zKSx0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLml0ZW1TZXQpLHRoaXMuaXRlbXNEYXRhPW51bGwsdGhpcy5ncm91cHNEYXRhPW51bGwsdGhpcy5kb20ucm9vdC5vbmNsaWNrPWZ1bmN0aW9uKHQpe2YuZW1pdCgiY2xpY2siLGYuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbmRibGNsaWNrPWZ1bmN0aW9uKHQpe2YuZW1pdCgiZG91YmxlQ2xpY2siLGYuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbmNvbnRleHRtZW51PWZ1bmN0aW9uKHQpe2YuZW1pdCgiY29udGV4dG1lbnUiLGYuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbm1vdXNlb3Zlcj1mdW5jdGlvbih0KXtmLmVtaXQoIm1vdXNlT3ZlciIsZi5nZXRFdmVudFByb3BlcnRpZXModCkpfSx3aW5kb3cuUG9pbnRlckV2ZW50Pyh0aGlzLmRvbS5yb290Lm9ucG9pbnRlcmRvd249ZnVuY3Rpb24odCl7Zi5lbWl0KCJtb3VzZURvd24iLGYuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbnBvaW50ZXJtb3ZlPWZ1bmN0aW9uKHQpe2YuZW1pdCgibW91c2VNb3ZlIixmLmdldEV2ZW50UHJvcGVydGllcyh0KSl9LHRoaXMuZG9tLnJvb3Qub25wb2ludGVydXA9ZnVuY3Rpb24odCl7Zi5lbWl0KCJtb3VzZVVwIixmLmdldEV2ZW50UHJvcGVydGllcyh0KSl9KToodGhpcy5kb20ucm9vdC5vbm1vdXNlbW92ZT1mdW5jdGlvbih0KXtmLmVtaXQoIm1vdXNlTW92ZSIsZi5nZXRFdmVudFByb3BlcnRpZXModCkpfSx0aGlzLmRvbS5yb290Lm9ubW91c2Vkb3duPWZ1bmN0aW9uKHQpe2YuZW1pdCgibW91c2VEb3duIixmLmdldEV2ZW50UHJvcGVydGllcyh0KSl9LHRoaXMuZG9tLnJvb3Qub25tb3VzZXVwPWZ1bmN0aW9uKHQpe2YuZW1pdCgibW91c2VVcCIsZi5nZXRFdmVudFByb3BlcnRpZXModCkpfSksdGhpcy5maXREb25lPSExLHRoaXMub24oImNoYW5nZWQiLGZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5pdGVtc0RhdGEmJiF0aGlzLm9wdGlvbnMucm9sbGluZ01vZGUmJiFmLmZpdERvbmUpaWYoZi5maXREb25lPSEwLHZvaWQgMCE9Zi5vcHRpb25zLnN0YXJ0fHx2b2lkIDAhPWYub3B0aW9ucy5lbmQpe2lmKHZvaWQgMD09Zi5vcHRpb25zLnN0YXJ0fHx2b2lkIDA9PWYub3B0aW9ucy5lbmQpdmFyIHQ9Zi5nZXRJdGVtUmFuZ2UoKTt2YXIgZT12b2lkIDAhPWYub3B0aW9ucy5zdGFydD9mLm9wdGlvbnMuc3RhcnQ6dC5taW4saT12b2lkIDAhPWYub3B0aW9ucy5lbmQ/Zi5vcHRpb25zLmVuZDp0Lm1heDtmLnNldFdpbmRvdyhlLGkse2FuaW1hdGlvbjohMX0pfWVsc2UgZi5maXQoe2FuaW1hdGlvbjohMX0pfSksZCYmdGhpcy5zZXRPcHRpb25zKGQpLGkmJnRoaXMuc2V0R3JvdXBzKGkpLGUmJnRoaXMuc2V0SXRlbXMoZSksdGhpcy5fcmVkcmF3KCl9dmFyIG49KGkoOTkpLGkoMTEyKSxpKDgyKSkscz1pKDEpLHI9aSg4OSksYT1pKDkzKSxoPWkoMTE4KSxkPWkoMTIyKSxsPWkoMTM5KSx1PWkoMTQzKSxjPWkoMTQxKSxwPWkoMTIzKSxmPWkoMTQ0KS5wcmludFN0eWxlLG09aSgxNDUpLmFsbE9wdGlvbnMsdj1pKDE0NSkuY29uZmlndXJlT3B0aW9ucyxnPWkoMTQ2KS5kZWZhdWx0LHk9aSgxNDQpLmRlZmF1bHQ7by5wcm90b3R5cGU9bmV3IGQsby5wcm90b3R5cGUuX2NyZWF0ZUNvbmZpZ3VyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgZyh0aGlzLHRoaXMuZG9tLmNvbnRhaW5lcix2KX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dGhpcy5pdGVtU2V0JiZ0aGlzLml0ZW1TZXQubWFya0RpcnR5KHtyZWZyZXNoSXRlbXM6ITB9KSx0aGlzLl9yZWRyYXcoKX0sby5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXtpZighMD09PXkudmFsaWRhdGUodCxtKSYmY29uc29sZS5sb2coIiVjRXJyb3JzIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgc3VwcGxpZWQgb3B0aW9ucyBvYmplY3QuIixmKSxkLnByb3RvdHlwZS5zZXRPcHRpb25zLmNhbGwodGhpcyx0KSwidHlwZSJpbiB0JiZ0LnR5cGUhPT10aGlzLm9wdGlvbnMudHlwZSl7dGhpcy5vcHRpb25zLnR5cGU9dC50eXBlO3ZhciBlPXRoaXMuaXRlbXNEYXRhO2lmKGUpe3ZhciBpPXRoaXMuZ2V0U2VsZWN0aW9uKCk7dGhpcy5zZXRJdGVtcyhudWxsKSx0aGlzLnNldEl0ZW1zKGUpLHRoaXMuc2V0U2VsZWN0aW9uKGkpfX19LG8ucHJvdG90eXBlLnNldEl0ZW1zPWZ1bmN0aW9uKHQpe3ZhciBlO2U9dD90IGluc3RhbmNlb2Ygcnx8dCBpbnN0YW5jZW9mIGE/dDpuZXcgcih0LHt0eXBlOntzdGFydDoiRGF0ZSIsZW5kOiJEYXRlIn19KTpudWxsLHRoaXMuaXRlbXNEYXRhPWUsdGhpcy5pdGVtU2V0JiZ0aGlzLml0ZW1TZXQuc2V0SXRlbXMoZSl9LG8ucHJvdG90eXBlLnNldEdyb3Vwcz1mdW5jdGlvbih0KXt2YXIgZTtpZih0KXt2YXIgaT1mdW5jdGlvbih0KXtyZXR1cm4hMSE9PXQudmlzaWJsZX07ZT10IGluc3RhbmNlb2Ygcnx8dCBpbnN0YW5jZW9mIGE/bmV3IGEodCx7ZmlsdGVyOml9KTpuZXcgcih0LmZpbHRlcihpKSl9ZWxzZSBlPW51bGw7dGhpcy5ncm91cHNEYXRhPWUsdGhpcy5pdGVtU2V0LnNldEdyb3VwcyhlKX0sby5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt0JiZ0Lmdyb3VwcyYmdGhpcy5zZXRHcm91cHModC5ncm91cHMpLHQmJnQuaXRlbXMmJnRoaXMuc2V0SXRlbXModC5pdGVtcyl9LG8ucHJvdG90eXBlLnNldFNlbGVjdGlvbj1mdW5jdGlvbih0LGUpe3RoaXMuaXRlbVNldCYmdGhpcy5pdGVtU2V0LnNldFNlbGVjdGlvbih0KSxlJiZlLmZvY3VzJiZ0aGlzLmZvY3VzKHQsZSl9LG8ucHJvdG90eXBlLmdldFNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZW1TZXQmJnRoaXMuaXRlbVNldC5nZXRTZWxlY3Rpb24oKXx8W119LG8ucHJvdG90eXBlLmZvY3VzPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5pdGVtc0RhdGEmJnZvaWQgMCE9dCl7dmFyIGk9QXJyYXkuaXNBcnJheSh0KT90Olt0XSxvPXRoaXMuaXRlbXNEYXRhLmdldERhdGFTZXQoKS5nZXQoaSx7dHlwZTp7c3RhcnQ6IkRhdGUiLGVuZDoiRGF0ZSJ9fSksbj1udWxsLHM9bnVsbDtpZihvLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5zdGFydC52YWx1ZU9mKCksaT0iZW5kImluIHQ/dC5lbmQudmFsdWVPZigpOnQuc3RhcnQudmFsdWVPZigpOyhudWxsPT09bnx8ZTxuKSYmKG49ZSksKG51bGw9PT1zfHxpPnMpJiYocz1pKX0pLG51bGwhPT1uJiZudWxsIT09cyl7dmFyIHI9KG4rcykvMixhPU1hdGgubWF4KHRoaXMucmFuZ2UuZW5kLXRoaXMucmFuZ2Uuc3RhcnQsMS4xKihzLW4pKSxoPSFlfHx2b2lkIDA9PT1lLmFuaW1hdGlvbnx8ZS5hbmltYXRpb247dGhpcy5yYW5nZS5zZXRSYW5nZShyLWEvMixyK2EvMix7YW5pbWF0aW9uOmh9KX19fSxvLnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24odCl7dmFyIGUsaT0hdHx8dm9pZCAwPT09dC5hbmltYXRpb258fHQuYW5pbWF0aW9uLG89dGhpcy5pdGVtc0RhdGEmJnRoaXMuaXRlbXNEYXRhLmdldERhdGFTZXQoKTsxPT09by5sZW5ndGgmJnZvaWQgMD09PW8uZ2V0KClbMF0uZW5kPyhlPXRoaXMuZ2V0RGF0YVJhbmdlKCksdGhpcy5tb3ZlVG8oZS5taW4udmFsdWVPZigpLHthbmltYXRpb246aX0pKTooZT10aGlzLmdldEl0ZW1SYW5nZSgpLHRoaXMucmFuZ2Uuc2V0UmFuZ2UoZS5taW4sZS5tYXgse2FuaW1hdGlvbjppfSkpfSxvLnByb3RvdHlwZS5nZXRJdGVtUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldERhdGFSYW5nZSgpLGU9bnVsbCE9PXQubWluP3QubWluLnZhbHVlT2YoKTpudWxsLGk9bnVsbCE9PXQubWF4P3QubWF4LnZhbHVlT2YoKTpudWxsLG89bnVsbCxuPW51bGw7aWYobnVsbCE9ZSYmbnVsbCE9aSl7dmFyIHI9ZnVuY3Rpb24odCl7cmV0dXJuIHMuY29udmVydCh0LmRhdGEuc3RhcnQsIkRhdGUiKS52YWx1ZU9mKCl9LGE9ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwIT10LmRhdGEuZW5kP3QuZGF0YS5lbmQ6dC5kYXRhLnN0YXJ0O3JldHVybiBzLmNvbnZlcnQoZSwiRGF0ZSIpLnZhbHVlT2YoKX0saD1pLWU7aDw9MCYmKGg9MTApO3ZhciBkPWgvdGhpcy5wcm9wcy5jZW50ZXIud2lkdGg7aWYocy5mb3JFYWNoKHRoaXMuaXRlbVNldC5pdGVtcyxmdW5jdGlvbih0KXt0Lmdyb3VwU2hvd2luZyYmKHQuc2hvdygpLHQucmVwb3NpdGlvblgoKSk7dmFyIHM9cih0KSxoPWEodCk7aWYodGhpcy5vcHRpb25zLnJ0bCl2YXIgbD1zLSh0LmdldFdpZHRoUmlnaHQoKSsxMCkqZCx1PWgrKHQuZ2V0V2lkdGhMZWZ0KCkrMTApKmQ7ZWxzZSB2YXIgbD1zLSh0LmdldFdpZHRoTGVmdCgpKzEwKSpkLHU9aCsodC5nZXRXaWR0aFJpZ2h0KCkrMTApKmQ7bDxlJiYoZT1sLG89dCksdT5pJiYoaT11LG49dCl9LmJpbmQodGhpcykpLG8mJm4pe3ZhciBsPW8uZ2V0V2lkdGhMZWZ0KCkrMTAsdT1uLmdldFdpZHRoUmlnaHQoKSsxMCxjPXRoaXMucHJvcHMuY2VudGVyLndpZHRoLWwtdTtjPjAmJih0aGlzLm9wdGlvbnMucnRsPyhlPXIobyktdSpoL2MsaT1hKG4pK2wqaC9jKTooZT1yKG8pLWwqaC9jLGk9YShuKSt1KmgvYykpfX1yZXR1cm57bWluOm51bGwhPWU/bmV3IERhdGUoZSk6bnVsbCxtYXg6bnVsbCE9aT9uZXcgRGF0ZShpKTpudWxsfX0sby5wcm90b3R5cGUuZ2V0RGF0YVJhbmdlPWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxlPW51bGwsaT10aGlzLml0ZW1zRGF0YSYmdGhpcy5pdGVtc0RhdGEuZ2V0RGF0YVNldCgpO3JldHVybiBpJiZpLmZvckVhY2goZnVuY3Rpb24oaSl7dmFyIG89cy5jb252ZXJ0KGkuc3RhcnQsIkRhdGUiKS52YWx1ZU9mKCksbj1zLmNvbnZlcnQodm9pZCAwIT1pLmVuZD9pLmVuZDppLnN0YXJ0LCJEYXRlIikudmFsdWVPZigpOyhudWxsPT09dHx8bzx0KSYmKHQ9byksKG51bGw9PT1lfHxuPmUpJiYoZT1uKX0pLHttaW46bnVsbCE9dD9uZXcgRGF0ZSh0KTpudWxsLG1heDpudWxsIT1lP25ldyBEYXRlKGUpOm51bGx9fSxvLnByb3RvdHlwZS5nZXRFdmVudFByb3BlcnRpZXM9ZnVuY3Rpb24odCl7dmFyIGU9dC5jZW50ZXI/dC5jZW50ZXIueDp0LmNsaWVudFgsaT10LmNlbnRlcj90LmNlbnRlci55OnQuY2xpZW50WTtpZih0aGlzLm9wdGlvbnMucnRsKXZhciBvPXMuZ2V0QWJzb2x1dGVSaWdodCh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIpLWU7ZWxzZSB2YXIgbz1lLXMuZ2V0QWJzb2x1dGVMZWZ0KHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lcik7dmFyIG49aS1zLmdldEFic29sdXRlVG9wKHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lcikscj10aGlzLml0ZW1TZXQuaXRlbUZyb21UYXJnZXQodCksYT10aGlzLml0ZW1TZXQuZ3JvdXBGcm9tVGFyZ2V0KHQpLGg9Yy5jdXN0b21UaW1lRnJvbVRhcmdldCh0KSxkPXRoaXMuaXRlbVNldC5vcHRpb25zLnNuYXB8fG51bGwsbD10aGlzLmJvZHkudXRpbC5nZXRTY2FsZSgpLHU9dGhpcy5ib2R5LnV0aWwuZ2V0U3RlcCgpLHA9dGhpcy5fdG9UaW1lKG8pLGY9ZD9kKHAsbCx1KTpwLG09cy5nZXRUYXJnZXQodCksdj1udWxsO3JldHVybiBudWxsIT1yP3Y9Iml0ZW0iOm51bGwhPWg/dj0iY3VzdG9tLXRpbWUiOnMuaGFzUGFyZW50KG0sdGhpcy50aW1lQXhpcy5kb20uZm9yZWdyb3VuZCk/dj0iYXhpcyI6dGhpcy50aW1lQXhpczImJnMuaGFzUGFyZW50KG0sdGhpcy50aW1lQXhpczIuZG9tLmZvcmVncm91bmQpP3Y9ImF4aXMiOnMuaGFzUGFyZW50KG0sdGhpcy5pdGVtU2V0LmRvbS5sYWJlbFNldCk/dj0iZ3JvdXAtbGFiZWwiOnMuaGFzUGFyZW50KG0sdGhpcy5jdXJyZW50VGltZS5iYXIpP3Y9ImN1cnJlbnQtdGltZSI6cy5oYXNQYXJlbnQobSx0aGlzLmRvbS5jZW50ZXIpJiYodj0iYmFja2dyb3VuZCIpLHtldmVudDp0LGl0ZW06cj9yLmlkOm51bGwsZ3JvdXA6YT9hLmdyb3VwSWQ6bnVsbCx3aGF0OnYscGFnZVg6dC5zcmNFdmVudD90LnNyY0V2ZW50LnBhZ2VYOnQucGFnZVgscGFnZVk6dC5zcmNFdmVudD90LnNyY0V2ZW50LnBhZ2VZOnQucGFnZVkseDpvLHk6bix0aW1lOnAsc25hcHBlZFRpbWU6Zn19LG8ucHJvdG90eXBlLnRvZ2dsZVJvbGxpbmdNb2RlPWZ1bmN0aW9uKCl7dGhpcy5yYW5nZS5yb2xsaW5nP3RoaXMucmFuZ2Uuc3RvcFJvbGxpbmcoKToodm9pZCAwPT10aGlzLm9wdGlvbnMucm9sbGluZ01vZGUmJnRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpLHRoaXMucmFuZ2Uuc3RhcnRSb2xsaW5nKCkpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXt2YXIgaT1wKCkuaG91cnMoMCkubWludXRlcygwKS5zZWNvbmRzKDApLm1pbGxpc2Vjb25kcygwKSxvPWkuY2xvbmUoKS5hZGQoLTMsImRheXMiKS52YWx1ZU9mKCksbj1pLmNsb25lKCkuYWRkKDMsImRheXMiKS52YWx1ZU9mKCk7dm9pZCAwPT09ZT8odGhpcy5zdGFydD1vLHRoaXMuZW5kPW4pOih0aGlzLnN0YXJ0PWUuc3RhcnR8fG8sdGhpcy5lbmQ9ZS5lbmR8fG4pLHRoaXMucm9sbGluZz0hMSx0aGlzLmJvZHk9dCx0aGlzLmRlbHRhRGlmZmVyZW5jZT0wLHRoaXMuc2NhbGVPZmZzZXQ9MCx0aGlzLnN0YXJ0VG9Gcm9udD0hMSx0aGlzLmVuZFRvRnJvbnQ9ITAsdGhpcy5kZWZhdWx0T3B0aW9ucz17cnRsOiExLHN0YXJ0Om51bGwsZW5kOm51bGwsbW9tZW50OnAsZGlyZWN0aW9uOiJob3Jpem9udGFsIixtb3ZlYWJsZTohMCx6b29tYWJsZTohMCxtaW46bnVsbCxtYXg6bnVsbCx6b29tTWluOjEwLHpvb21NYXg6MzE1MzZlMTAscm9sbGluZ01vZGU6e2ZvbGxvdzohMSxvZmZzZXQ6LjV9fSx0aGlzLm9wdGlvbnM9Yy5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5wcm9wcz17dG91Y2g6e319LHRoaXMuYW5pbWF0aW9uVGltZXI9bnVsbCx0aGlzLmJvZHkuZW1pdHRlci5vbigicGFuc3RhcnQiLHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJwYW5tb3ZlIix0aGlzLl9vbkRyYWcuYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oInBhbmVuZCIsdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJtb3VzZXdoZWVsIix0aGlzLl9vbk1vdXNlV2hlZWwuYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oInRvdWNoIix0aGlzLl9vblRvdWNoLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJwaW5jaCIsdGhpcy5fb25QaW5jaC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZG9tLnJvbGxpbmdNb2RlQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnN0YXJ0Um9sbGluZy5iaW5kKHRoaXMpKSx0aGlzLnNldE9wdGlvbnMoZSl9ZnVuY3Rpb24gcyh0KXtpZigiaG9yaXpvbnRhbCIhPXQmJiJ2ZXJ0aWNhbCIhPXQpdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBkaXJlY3Rpb24gIicrdCsnIi4gQ2hvb3NlICJob3Jpem9udGFsIiBvciAidmVydGljYWwiLicpfXZhciByPWkoNTgpLGE9byhyKSxoPWkoOTApLGQ9byhoKSxsPWkoNjIpLHU9byhsKSxjPWkoMSkscD0oaSgxMTkpLGkoODIpKSxmPWkoMTIwKSxtPWkoMTIxKTtuLnByb3RvdHlwZT1uZXcgZixuLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPVsiYW5pbWF0aW9uIiwiZGlyZWN0aW9uIiwibWluIiwibWF4Iiwiem9vbU1pbiIsInpvb21NYXgiLCJtb3ZlYWJsZSIsInpvb21hYmxlIiwibW9tZW50IiwiYWN0aXZhdGUiLCJoaWRkZW5EYXRlcyIsInpvb21LZXkiLCJydGwiLCJzaG93Q3VycmVudFRpbWUiLCJyb2xsaW5nTW9kZSIsImhvcml6b250YWxTY3JvbGwiXTtjLnNlbGVjdGl2ZUV4dGVuZChlLHRoaXMub3B0aW9ucyx0KSx0LnJvbGxpbmdNb2RlJiZ0LnJvbGxpbmdNb2RlLmZvbGxvdyYmdGhpcy5zdGFydFJvbGxpbmcoKSwoInN0YXJ0ImluIHR8fCJlbmQiaW4gdCkmJnRoaXMuc2V0UmFuZ2UodC5zdGFydCx0LmVuZCl9fSxuLnByb3RvdHlwZS5zdGFydFJvbGxpbmc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ZS5zdG9wUm9sbGluZygpLGUucm9sbGluZz0hMDt2YXIgaT1lLmVuZC1lLnN0YXJ0LG89Yy5jb252ZXJ0KG5ldyBEYXRlLCJEYXRlIikudmFsdWVPZigpLG49by1pKmUub3B0aW9ucy5yb2xsaW5nTW9kZS5vZmZzZXQscz1vK2kqKDEtZS5vcHRpb25zLnJvbGxpbmdNb2RlLm9mZnNldCkscj0oIWUub3B0aW9uc3x8dm9pZCAwPT09ZS5vcHRpb25zLmFuaW1hdGlvbnx8ZS5vcHRpb25zLmFuaW1hdGlvbix7YW5pbWF0aW9uOiExfSk7ZS5zZXRSYW5nZShuLHMscik7dmFyIGE9ZS5jb252ZXJzaW9uKGUuYm9keS5kb21Qcm9wcy5jZW50ZXIud2lkdGgpLnNjYWxlLGk9MS9hLzEwO2k8MzAmJihpPTMwKSxpPjFlMyYmKGk9MWUzKSxlLmJvZHkuZG9tLnJvbGxpbmdNb2RlQnRuLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsZS5jdXJyZW50VGltZVRpbWVyPXNldFRpbWVvdXQodCxpKX12YXIgZT10aGlzO3QoKX0sbi5wcm90b3R5cGUuc3RvcFJvbGxpbmc9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLmN1cnJlbnRUaW1lVGltZXImJihjbGVhclRpbWVvdXQodGhpcy5jdXJyZW50VGltZVRpbWVyKSx0aGlzLnJvbGxpbmc9ITEsdGhpcy5ib2R5LmRvbS5yb2xsaW5nTW9kZUJ0bi5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIil9LG4ucHJvdG90eXBlLnNldFJhbmdlPWZ1bmN0aW9uKHQsZSxpLG8pe2l8fChpPXt9KSwhMCE9PWkuYnlVc2VyJiYoaS5ieVVzZXI9ITEpO3ZhciBuPXRoaXMscz12b2lkIDAhPXQ/Yy5jb252ZXJ0KHQsIkRhdGUiKS52YWx1ZU9mKCk6bnVsbCxyPXZvaWQgMCE9ZT9jLmNvbnZlcnQoZSwiRGF0ZSIpLnZhbHVlT2YoKTpudWxsO2lmKHRoaXMuX2NhbmNlbEFuaW1hdGlvbigpLGkuYW5pbWF0aW9uKXt2YXIgaD10aGlzLnN0YXJ0LGw9dGhpcy5lbmQscD0ib2JqZWN0Ij09PSgwLHUuZGVmYXVsdCkoaS5hbmltYXRpb24pJiYiZHVyYXRpb24iaW4gaS5hbmltYXRpb24/aS5hbmltYXRpb24uZHVyYXRpb246NTAwLGY9Im9iamVjdCI9PT0oMCx1LmRlZmF1bHQpKGkuYW5pbWF0aW9uKSYmImVhc2luZ0Z1bmN0aW9uImluIGkuYW5pbWF0aW9uP2kuYW5pbWF0aW9uLmVhc2luZ0Z1bmN0aW9uOiJlYXNlSW5PdXRRdWFkIix2PWMuZWFzaW5nRnVuY3Rpb25zW2ZdO2lmKCF2KXRocm93IG5ldyBFcnJvcigiVW5rbm93biBlYXNpbmcgZnVuY3Rpb24gIisoMCxkLmRlZmF1bHQpKGYpKyIuIENob29zZSBmcm9tOiAiKygwLGEuZGVmYXVsdCkoYy5lYXNpbmdGdW5jdGlvbnMpLmpvaW4oIiwgIikpO3ZhciBnPShuZXcgRGF0ZSkudmFsdWVPZigpLHk9ITE7cmV0dXJuIGZ1bmN0aW9uIHQoKXtpZighbi5wcm9wcy50b3VjaC5kcmFnZ2luZyl7dmFyIGU9KG5ldyBEYXRlKS52YWx1ZU9mKCksYT1lLWcsZD12KGEvcCksdT1hPnAsYz11fHxudWxsPT09cz9zOmgrKHMtaCkqZCxmPXV8fG51bGw9PT1yP3I6bCsoci1sKSpkO2I9bi5fYXBwbHlSYW5nZShjLGYpLG0udXBkYXRlSGlkZGVuRGF0ZXMobi5vcHRpb25zLm1vbWVudCxuLmJvZHksbi5vcHRpb25zLmhpZGRlbkRhdGVzKSx5PXl8fGI7dmFyIF89e3N0YXJ0Om5ldyBEYXRlKG4uc3RhcnQpLGVuZDpuZXcgRGF0ZShuLmVuZCksYnlVc2VyOmkuYnlVc2VyLGV2ZW50OmkuZXZlbnR9O2lmKGImJm4uYm9keS5lbWl0dGVyLmVtaXQoInJhbmdlY2hhbmdlIixfKSx1KXtpZih5JiYobi5ib2R5LmVtaXR0ZXIuZW1pdCgicmFuZ2VjaGFuZ2VkIixfKSxvKSlyZXR1cm4gbygpfWVsc2Ugbi5hbmltYXRpb25UaW1lcj1zZXRUaW1lb3V0KHQsMjApfX0oKX12YXIgYj10aGlzLl9hcHBseVJhbmdlKHMscik7aWYobS51cGRhdGVIaWRkZW5EYXRlcyh0aGlzLm9wdGlvbnMubW9tZW50LHRoaXMuYm9keSx0aGlzLm9wdGlvbnMuaGlkZGVuRGF0ZXMpLGIpe3ZhciBfPXtzdGFydDpuZXcgRGF0ZSh0aGlzLnN0YXJ0KSxlbmQ6bmV3IERhdGUodGhpcy5lbmQpLGJ5VXNlcjppLmJ5VXNlcixldmVudDppLmV2ZW50fTtpZih0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJyYW5nZWNoYW5nZSIsXyksY2xlYXJUaW1lb3V0KG4udGltZW91dElEKSxuLnRpbWVvdXRJRD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5ib2R5LmVtaXR0ZXIuZW1pdCgicmFuZ2VjaGFuZ2VkIixfKX0sMjAwKSxvKXJldHVybiBvKCl9fSxuLnByb3RvdHlwZS5nZXRNaWxsaXNlY29uZHNQZXJQaXhlbD1mdW5jdGlvbigpe3JldHVybih0aGlzLmVuZC10aGlzLnN0YXJ0KS90aGlzLmJvZHkuZG9tLmNlbnRlci5jbGllbnRXaWR0aH0sbi5wcm90b3R5cGUuX2NhbmNlbEFuaW1hdGlvbj1mdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uVGltZXImJihjbGVhclRpbWVvdXQodGhpcy5hbmltYXRpb25UaW1lciksdGhpcy5hbmltYXRpb25UaW1lcj1udWxsKX0sbi5wcm90b3R5cGUuX2FwcGx5UmFuZ2U9ZnVuY3Rpb24odCxlKXt2YXIgaSxvPW51bGwhPXQ/Yy5jb252ZXJ0KHQsIkRhdGUiKS52YWx1ZU9mKCk6dGhpcy5zdGFydCxuPW51bGwhPWU/Yy5jb252ZXJ0KGUsIkRhdGUiKS52YWx1ZU9mKCk6dGhpcy5lbmQscz1udWxsIT10aGlzLm9wdGlvbnMubWF4P2MuY29udmVydCh0aGlzLm9wdGlvbnMubWF4LCJEYXRlIikudmFsdWVPZigpOm51bGwscj1udWxsIT10aGlzLm9wdGlvbnMubWluP2MuY29udmVydCh0aGlzLm9wdGlvbnMubWluLCJEYXRlIikudmFsdWVPZigpOm51bGw7aWYoaXNOYU4obyl8fG51bGw9PT1vKXRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGFydCAiJyt0KyciJyk7aWYoaXNOYU4obil8fG51bGw9PT1uKXRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmQgIicrZSsnIicpO2lmKG48byYmKG49byksbnVsbCE9PXImJm88ciYmKGk9ci1vLG8rPWksbis9aSxudWxsIT1zJiZuPnMmJihuPXMpKSxudWxsIT09cyYmbj5zJiYoaT1uLXMsby09aSxuLT1pLG51bGwhPXImJm88ciYmKG89cikpLG51bGwhPT10aGlzLm9wdGlvbnMuem9vbU1pbil7dmFyIGE9cGFyc2VGbG9hdCh0aGlzLm9wdGlvbnMuem9vbU1pbik7aWYoYTwwJiYoYT0wKSxuLW88YSl7dGhpcy5lbmQtdGhpcy5zdGFydD09PWEmJm8+PXRoaXMuc3RhcnQtLjUmJm48PXRoaXMuZW5kPyhvPXRoaXMuc3RhcnQsbj10aGlzLmVuZCk6KGk9YS0obi1vKSxvLT1pLzIsbis9aS8yKX19aWYobnVsbCE9PXRoaXMub3B0aW9ucy56b29tTWF4KXt2YXIgaD1wYXJzZUZsb2F0KHRoaXMub3B0aW9ucy56b29tTWF4KTtoPDAmJihoPTApLG4tbz5oJiYodGhpcy5lbmQtdGhpcy5zdGFydD09PWgmJm88dGhpcy5zdGFydCYmbj50aGlzLmVuZD8obz10aGlzLnN0YXJ0LG49dGhpcy5lbmQpOihpPW4tby1oLG8rPWkvMixuLT1pLzIpKX12YXIgZD10aGlzLnN0YXJ0IT1vfHx0aGlzLmVuZCE9bjtyZXR1cm4gbz49dGhpcy5zdGFydCYmbzw9dGhpcy5lbmR8fG4+PXRoaXMuc3RhcnQmJm48PXRoaXMuZW5kfHx0aGlzLnN0YXJ0Pj1vJiZ0aGlzLnN0YXJ0PD1ufHx0aGlzLmVuZD49byYmdGhpcy5lbmQ8PW58fHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoImNoZWNrUmFuZ2VkSXRlbXMiKSx0aGlzLnN0YXJ0PW8sdGhpcy5lbmQ9bixkfSxuLnByb3RvdHlwZS5nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybntzdGFydDp0aGlzLnN0YXJ0LGVuZDp0aGlzLmVuZH19LG4ucHJvdG90eXBlLmNvbnZlcnNpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5jb252ZXJzaW9uKHRoaXMuc3RhcnQsdGhpcy5lbmQsdCxlKX0sbi5jb252ZXJzaW9uPWZ1bmN0aW9uKHQsZSxpLG8pe3JldHVybiB2b2lkIDA9PT1vJiYobz0wKSwwIT1pJiZlLXQhPTA/e29mZnNldDp0LHNjYWxlOmkvKGUtdC1vKX06e29mZnNldDowLHNjYWxlOjF9fSxuLnByb3RvdHlwZS5fb25EcmFnU3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5kZWx0YURpZmZlcmVuY2U9MCx0aGlzLnByZXZpb3VzRGVsdGE9MCx0aGlzLm9wdGlvbnMubW92ZWFibGUmJnRoaXMuX2lzSW5zaWRlUmFuZ2UodCkmJnRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZyYmKHRoaXMuc3RvcFJvbGxpbmcoKSx0aGlzLnByb3BzLnRvdWNoLnN0YXJ0PXRoaXMuc3RhcnQsdGhpcy5wcm9wcy50b3VjaC5lbmQ9dGhpcy5lbmQsdGhpcy5wcm9wcy50b3VjaC5kcmFnZ2luZz0hMCx0aGlzLmJvZHkuZG9tLnJvb3QmJih0aGlzLmJvZHkuZG9tLnJvb3Quc3R5bGUuY3Vyc29yPSJtb3ZlIikpfSxuLnByb3RvdHlwZS5fb25EcmFnPWZ1bmN0aW9uKHQpe2lmKHQmJnRoaXMucHJvcHMudG91Y2guZHJhZ2dpbmcmJnRoaXMub3B0aW9ucy5tb3ZlYWJsZSYmdGhpcy5wcm9wcy50b3VjaC5hbGxvd0RyYWdnaW5nKXt2YXIgZT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uO3MoZSk7dmFyIGk9Imhvcml6b250YWwiPT1lP3QuZGVsdGFYOnQuZGVsdGFZO2ktPXRoaXMuZGVsdGFEaWZmZXJlbmNlO3ZhciBvPXRoaXMucHJvcHMudG91Y2guZW5kLXRoaXMucHJvcHMudG91Y2guc3RhcnQ7by09bS5nZXRIaWRkZW5EdXJhdGlvbkJldHdlZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLHRoaXMuc3RhcnQsdGhpcy5lbmQpO3ZhciBuPSJob3Jpem9udGFsIj09ZT90aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyLndpZHRoOnRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXIuaGVpZ2h0O2lmKHRoaXMub3B0aW9ucy5ydGwpdmFyIHI9aS9uKm87ZWxzZSB2YXIgcj0taS9uKm87dmFyIGE9dGhpcy5wcm9wcy50b3VjaC5zdGFydCtyLGg9dGhpcy5wcm9wcy50b3VjaC5lbmQrcixkPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxhLHRoaXMucHJldmlvdXNEZWx0YS1pLCEwKSxsPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxoLHRoaXMucHJldmlvdXNEZWx0YS1pLCEwKTtpZihkIT1hfHxsIT1oKXJldHVybiB0aGlzLmRlbHRhRGlmZmVyZW5jZSs9aSx0aGlzLnByb3BzLnRvdWNoLnN0YXJ0PWQsdGhpcy5wcm9wcy50b3VjaC5lbmQ9bCx2b2lkIHRoaXMuX29uRHJhZyh0KTt0aGlzLnByZXZpb3VzRGVsdGE9aSx0aGlzLl9hcHBseVJhbmdlKGEsaCk7dmFyIHU9bmV3IERhdGUodGhpcy5zdGFydCksYz1uZXcgRGF0ZSh0aGlzLmVuZCk7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgicmFuZ2VjaGFuZ2UiLHtzdGFydDp1LGVuZDpjLGJ5VXNlcjohMCxldmVudDp0fSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgicGFubW92ZSIpfX0sbi5wcm90b3R5cGUuX29uRHJhZ0VuZD1mdW5jdGlvbih0KXt0aGlzLnByb3BzLnRvdWNoLmRyYWdnaW5nJiZ0aGlzLm9wdGlvbnMubW92ZWFibGUmJnRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZyYmKHRoaXMucHJvcHMudG91Y2guZHJhZ2dpbmc9ITEsdGhpcy5ib2R5LmRvbS5yb290JiYodGhpcy5ib2R5LmRvbS5yb290LnN0eWxlLmN1cnNvcj0iYXV0byIpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInJhbmdlY2hhbmdlZCIse3N0YXJ0Om5ldyBEYXRlKHRoaXMuc3RhcnQpLGVuZDpuZXcgRGF0ZSh0aGlzLmVuZCksYnlVc2VyOiEwLGV2ZW50OnR9KSl9LG4ucHJvdG90eXBlLl9vbk1vdXNlV2hlZWw9ZnVuY3Rpb24odCl7dmFyIGU9MDtpZih0LndoZWVsRGVsdGE/ZT10LndoZWVsRGVsdGEvMTIwOnQuZGV0YWlsJiYoZT0tdC5kZXRhaWwvMyksdGhpcy5vcHRpb25zLnpvb21LZXkmJiF0W3RoaXMub3B0aW9ucy56b29tS2V5XSYmdGhpcy5vcHRpb25zLnpvb21hYmxlfHwhdGhpcy5vcHRpb25zLnpvb21hYmxlJiZ0aGlzLm9wdGlvbnMubW92ZWFibGUpe2lmKHRoaXMub3B0aW9ucy5ob3Jpem9udGFsU2Nyb2xsKXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIGk9ZSoodGhpcy5lbmQtdGhpcy5zdGFydCkvMjAsbz10aGlzLnN0YXJ0LWksbj10aGlzLmVuZC1pLHM9e2FuaW1hdGlvbjohMSxieVVzZXI6ITAsZXZlbnQ6dH07dGhpcy5zZXRSYW5nZShvLG4scyl9fWVsc2UgaWYodGhpcy5vcHRpb25zLnpvb21hYmxlJiZ0aGlzLm9wdGlvbnMubW92ZWFibGUmJnRoaXMuX2lzSW5zaWRlUmFuZ2UodCkmJmUpe3ZhciByO3I9ZTwwPzEtZS81OjEvKDErZS81KTt2YXIgYTtpZih0aGlzLnJvbGxpbmcpYT10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLm9wdGlvbnMucm9sbGluZ01vZGUub2Zmc2V0O2Vsc2V7dmFyIGg9dGhpcy5nZXRQb2ludGVyKHt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0sdGhpcy5ib2R5LmRvbS5jZW50ZXIpO2E9dGhpcy5fcG9pbnRlclRvRGF0ZShoKX10aGlzLnpvb20ocixhLGUsdCksdC5wcmV2ZW50RGVmYXVsdCgpfX0sbi5wcm90b3R5cGUuX29uVG91Y2g9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy50b3VjaC5zdGFydD10aGlzLnN0YXJ0LHRoaXMucHJvcHMudG91Y2guZW5kPXRoaXMuZW5kLHRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZz0hMCx0aGlzLnByb3BzLnRvdWNoLmNlbnRlcj1udWxsLHRoaXMuc2NhbGVPZmZzZXQ9MCx0aGlzLmRlbHRhRGlmZmVyZW5jZT0wfSxuLnByb3RvdHlwZS5fb25QaW5jaD1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuem9vbWFibGUmJnRoaXMub3B0aW9ucy5tb3ZlYWJsZSl7dGhpcy5wcm9wcy50b3VjaC5hbGxvd0RyYWdnaW5nPSExLHRoaXMucHJvcHMudG91Y2guY2VudGVyfHwodGhpcy5wcm9wcy50b3VjaC5jZW50ZXI9dGhpcy5nZXRQb2ludGVyKHQuY2VudGVyLHRoaXMuYm9keS5kb20uY2VudGVyKSksdGhpcy5zdG9wUm9sbGluZygpO3ZhciBlPTEvKHQuc2NhbGUrdGhpcy5zY2FsZU9mZnNldCksaT10aGlzLl9wb2ludGVyVG9EYXRlKHRoaXMucHJvcHMudG91Y2guY2VudGVyKSxvPW0uZ2V0SGlkZGVuRHVyYXRpb25CZXR3ZWVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyx0aGlzLnN0YXJ0LHRoaXMuZW5kKSxuPW0uZ2V0SGlkZGVuRHVyYXRpb25CZWZvcmUodGhpcy5vcHRpb25zLm1vbWVudCx0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcyxpKSxzPW8tbixyPWktbisodGhpcy5wcm9wcy50b3VjaC5zdGFydC0oaS1uKSkqZSxhPWkrcysodGhpcy5wcm9wcy50b3VjaC5lbmQtKGkrcykpKmU7dGhpcy5zdGFydFRvRnJvbnQ9MS1lPD0wLHRoaXMuZW5kVG9Gcm9udD1lLTE8PTA7dmFyIGg9bS5zbmFwQXdheUZyb21IaWRkZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLHIsMS1lLCEwKSxkPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxhLGUtMSwhMCk7aD09ciYmZD09YXx8KHRoaXMucHJvcHMudG91Y2guc3RhcnQ9aCx0aGlzLnByb3BzLnRvdWNoLmVuZD1kLHRoaXMuc2NhbGVPZmZzZXQ9MS10LnNjYWxlLHI9aCxhPWQpO3ZhciBsPXthbmltYXRpb246ITEsYnlVc2VyOiEwLGV2ZW50OnR9O3RoaXMuc2V0UmFuZ2UocixhLGwpLHRoaXMuc3RhcnRUb0Zyb250PSExLHRoaXMuZW5kVG9Gcm9udD0hMH19LG4ucHJvdG90eXBlLl9pc0luc2lkZVJhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2VudGVyP3QuY2VudGVyLng6dC5jbGllbnRYO2lmKHRoaXMub3B0aW9ucy5ydGwpdmFyIGk9ZS1jLmdldEFic29sdXRlTGVmdCh0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lcik7ZWxzZSB2YXIgaT1jLmdldEFic29sdXRlUmlnaHQodGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIpLWU7dmFyIG89dGhpcy5ib2R5LnV0aWwudG9UaW1lKGkpO3JldHVybiBvPj10aGlzLnN0YXJ0JiZvPD10aGlzLmVuZH0sbi5wcm90b3R5cGUuX3BvaW50ZXJUb0RhdGU9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uO2lmKHMoaSksImhvcml6b250YWwiPT1pKXJldHVybiB0aGlzLmJvZHkudXRpbC50b1RpbWUodC54KS52YWx1ZU9mKCk7dmFyIG89dGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlci5oZWlnaHQ7cmV0dXJuIGU9dGhpcy5jb252ZXJzaW9uKG8pLHQueS9lLnNjYWxlK2Uub2Zmc2V0fSxuLnByb3RvdHlwZS5nZXRQb2ludGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMub3B0aW9ucy5ydGw/e3g6Yy5nZXRBYnNvbHV0ZVJpZ2h0KGUpLXQueCx5OnQueS1jLmdldEFic29sdXRlVG9wKGUpfTp7eDp0LngtYy5nZXRBYnNvbHV0ZUxlZnQoZSkseTp0LnktYy5nZXRBYnNvbHV0ZVRvcChlKX19LG4ucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odCxlLGksbyl7bnVsbD09ZSYmKGU9KHRoaXMuc3RhcnQrdGhpcy5lbmQpLzIpO3ZhciBuPW0uZ2V0SGlkZGVuRHVyYXRpb25CZXR3ZWVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyx0aGlzLnN0YXJ0LHRoaXMuZW5kKSxzPW0uZ2V0SGlkZGVuRHVyYXRpb25CZWZvcmUodGhpcy5vcHRpb25zLm1vbWVudCx0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcyxlKSxyPW4tcyxhPWUtcysodGhpcy5zdGFydC0oZS1zKSkqdCxoPWUrcisodGhpcy5lbmQtKGUrcikpKnQ7dGhpcy5zdGFydFRvRnJvbnQ9IShpPjApLHRoaXMuZW5kVG9Gcm9udD0hKC1pPjApO3ZhciBkPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxhLGksITApLGw9bS5zbmFwQXdheUZyb21IaWRkZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLGgsLWksITApO2Q9PWEmJmw9PWh8fChhPWQsaD1sKTt2YXIgdT17YW5pbWF0aW9uOiExLGJ5VXNlcjohMCxldmVudDpvfTt0aGlzLnNldFJhbmdlKGEsaCx1KSx0aGlzLnN0YXJ0VG9Gcm9udD0hMSx0aGlzLmVuZFRvRnJvbnQ9ITB9LG4ucHJvdG90eXBlLm1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lbmQtdGhpcy5zdGFydCxpPXRoaXMuc3RhcnQrZSp0LG89dGhpcy5lbmQrZSp0O3RoaXMuc3RhcnQ9aSx0aGlzLmVuZD1vfSxuLnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24odCl7dmFyIGU9KHRoaXMuc3RhcnQrdGhpcy5lbmQpLzIsaT1lLXQsbz10aGlzLnN0YXJ0LWksbj10aGlzLmVuZC1pLHM9e2FuaW1hdGlvbjohMSxieVVzZXI6ITAsZXZlbnQ6bnVsbH07dGhpcy5zZXRSYW5nZShvLG4scyl9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7aSgxMTIpO2Uub25Ub3VjaD1mdW5jdGlvbih0LGUpe2UuaW5wdXRIYW5kbGVyPWZ1bmN0aW9uKHQpe3QuaXNGaXJzdCYmZSh0KX0sdC5vbigiaGFtbWVyLmlucHV0IixlLmlucHV0SGFuZGxlcil9LGUub25SZWxlYXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5wdXRIYW5kbGVyPWZ1bmN0aW9uKHQpe3QuaXNGaW5hbCYmZSh0KX0sdC5vbigiaGFtbWVyLmlucHV0IixlLmlucHV0SGFuZGxlcil9LGUub2ZmVG91Y2g9ZnVuY3Rpb24odCxlKXt0Lm9mZigiaGFtbWVyLmlucHV0IixlLmlucHV0SGFuZGxlcil9LGUub2ZmUmVsZWFzZT1lLm9mZlRvdWNoLGUuZGlzYWJsZVByZXZlbnREZWZhdWx0VmVydGljYWxseT1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRUb3VjaEFjdGlvbj1mdW5jdGlvbigpe3JldHVyblsicGFuLXkiXX0sdH19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7dGhpcy5vcHRpb25zPW51bGwsdGhpcy5wcm9wcz1udWxsfXZhciBuPWkoMSk7by5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXt0JiZuLmV4dGVuZCh0aGlzLm9wdGlvbnMsdCl9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3JldHVybiExfSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7fSxvLnByb3RvdHlwZS5faXNSZXNpemVkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5fcHJldmlvdXNXaWR0aCE9PXRoaXMucHJvcHMud2lkdGh8fHRoaXMucHJvcHMuX3ByZXZpb3VzSGVpZ2h0IT09dGhpcy5wcm9wcy5oZWlnaHQ7cmV0dXJuIHRoaXMucHJvcHMuX3ByZXZpb3VzV2lkdGg9dGhpcy5wcm9wcy53aWR0aCx0aGlzLnByb3BzLl9wcmV2aW91c0hlaWdodD10aGlzLnByb3BzLmhlaWdodCx0fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlKXtlLmNvbnZlcnRIaWRkZW5PcHRpb25zPWZ1bmN0aW9uKHQsaSxvKXtpZihvJiYhQXJyYXkuaXNBcnJheShvKSlyZXR1cm4gZS5jb252ZXJ0SGlkZGVuT3B0aW9ucyh0LGksW29dKTtpZihpLmhpZGRlbkRhdGVzPVtdLG8mJjE9PUFycmF5LmlzQXJyYXkobykpe2Zvcih2YXIgbj0wO248by5sZW5ndGg7bisrKWlmKHZvaWQgMD09PW9bbl0ucmVwZWF0KXt2YXIgcz17fTtzLnN0YXJ0PXQob1tuXS5zdGFydCkudG9EYXRlKCkudmFsdWVPZigpLHMuZW5kPXQob1tuXS5lbmQpLnRvRGF0ZSgpLnZhbHVlT2YoKSxpLmhpZGRlbkRhdGVzLnB1c2gocyl9aS5oaWRkZW5EYXRlcy5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc3RhcnQtZS5zdGFydH0pfX0sZS51cGRhdGVIaWRkZW5EYXRlcz1mdW5jdGlvbih0LGksbyl7aWYobyYmIUFycmF5LmlzQXJyYXkobykpcmV0dXJuIGUudXBkYXRlSGlkZGVuRGF0ZXModCxpLFtvXSkKO2lmKG8mJnZvaWQgMCE9PWkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLndpZHRoKXtlLmNvbnZlcnRIaWRkZW5PcHRpb25zKHQsaSxvKTtmb3IodmFyIG49dChpLnJhbmdlLnN0YXJ0KSxzPXQoaS5yYW5nZS5lbmQpLHI9aS5yYW5nZS5lbmQtaS5yYW5nZS5zdGFydCxhPXIvaS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIud2lkdGgsaD0wO2g8by5sZW5ndGg7aCsrKWlmKHZvaWQgMCE9PW9baF0ucmVwZWF0KXt2YXIgZD10KG9baF0uc3RhcnQpLGw9dChvW2hdLmVuZCk7aWYoIkludmFsaWQgRGF0ZSI9PWQuX2QpdGhyb3cgbmV3IEVycm9yKCJTdXBwbGllZCBzdGFydCBkYXRlIGlzIG5vdCB2YWxpZDogIitvW2hdLnN0YXJ0KTtpZigiSW52YWxpZCBEYXRlIj09bC5fZCl0aHJvdyBuZXcgRXJyb3IoIlN1cHBsaWVkIGVuZCBkYXRlIGlzIG5vdCB2YWxpZDogIitvW2hdLmVuZCk7dmFyIHU9bC1kO2lmKHU+PTQqYSl7dmFyIGM9MCxwPXMuY2xvbmUoKTtzd2l0Y2gob1toXS5yZXBlYXQpe2Nhc2UiZGFpbHkiOmQuZGF5KCkhPWwuZGF5KCkmJihjPTEpLGQuZGF5T2ZZZWFyKG4uZGF5T2ZZZWFyKCkpLGQueWVhcihuLnllYXIoKSksZC5zdWJ0cmFjdCg3LCJkYXlzIiksbC5kYXlPZlllYXIobi5kYXlPZlllYXIoKSksbC55ZWFyKG4ueWVhcigpKSxsLnN1YnRyYWN0KDctYywiZGF5cyIpLHAuYWRkKDEsIndlZWtzIik7YnJlYWs7Y2FzZSJ3ZWVrbHkiOnZhciBmPWwuZGlmZihkLCJkYXlzIiksbT1kLmRheSgpO2QuZGF0ZShuLmRhdGUoKSksZC5tb250aChuLm1vbnRoKCkpLGQueWVhcihuLnllYXIoKSksbD1kLmNsb25lKCksZC5kYXkobSksbC5kYXkobSksbC5hZGQoZiwiZGF5cyIpLGQuc3VidHJhY3QoMSwid2Vla3MiKSxsLnN1YnRyYWN0KDEsIndlZWtzIikscC5hZGQoMSwid2Vla3MiKTticmVhaztjYXNlIm1vbnRobHkiOmQubW9udGgoKSE9bC5tb250aCgpJiYoYz0xKSxkLm1vbnRoKG4ubW9udGgoKSksZC55ZWFyKG4ueWVhcigpKSxkLnN1YnRyYWN0KDEsIm1vbnRocyIpLGwubW9udGgobi5tb250aCgpKSxsLnllYXIobi55ZWFyKCkpLGwuc3VidHJhY3QoMSwibW9udGhzIiksbC5hZGQoYywibW9udGhzIikscC5hZGQoMSwibW9udGhzIik7YnJlYWs7Y2FzZSJ5ZWFybHkiOmQueWVhcigpIT1sLnllYXIoKSYmKGM9MSksZC55ZWFyKG4ueWVhcigpKSxkLnN1YnRyYWN0KDEsInllYXJzIiksbC55ZWFyKG4ueWVhcigpKSxsLnN1YnRyYWN0KDEsInllYXJzIiksbC5hZGQoYywieWVhcnMiKSxwLmFkZCgxLCJ5ZWFycyIpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHZvaWQgY29uc29sZS5sb2coIldyb25nIHJlcGVhdCBmb3JtYXQsIGFsbG93ZWQgYXJlOiBkYWlseSwgd2Vla2x5LCBtb250aGx5LCB5ZWFybHkuIEdpdmVuOiIsb1toXS5yZXBlYXQpfWZvcig7ZDxwOylzd2l0Y2goaS5oaWRkZW5EYXRlcy5wdXNoKHtzdGFydDpkLnZhbHVlT2YoKSxlbmQ6bC52YWx1ZU9mKCl9KSxvW2hdLnJlcGVhdCl7Y2FzZSJkYWlseSI6ZC5hZGQoMSwiZGF5cyIpLGwuYWRkKDEsImRheXMiKTticmVhaztjYXNlIndlZWtseSI6ZC5hZGQoMSwid2Vla3MiKSxsLmFkZCgxLCJ3ZWVrcyIpO2JyZWFrO2Nhc2UibW9udGhseSI6ZC5hZGQoMSwibW9udGhzIiksbC5hZGQoMSwibW9udGhzIik7YnJlYWs7Y2FzZSJ5ZWFybHkiOmQuYWRkKDEsInkiKSxsLmFkZCgxLCJ5Iik7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdm9pZCBjb25zb2xlLmxvZygiV3JvbmcgcmVwZWF0IGZvcm1hdCwgYWxsb3dlZCBhcmU6IGRhaWx5LCB3ZWVrbHksIG1vbnRobHksIHllYXJseS4gR2l2ZW46IixvW2hdLnJlcGVhdCl9aS5oaWRkZW5EYXRlcy5wdXNoKHtzdGFydDpkLnZhbHVlT2YoKSxlbmQ6bC52YWx1ZU9mKCl9KX19ZS5yZW1vdmVEdXBsaWNhdGVzKGkpO3ZhciB2PWUuaXNIaWRkZW4oaS5yYW5nZS5zdGFydCxpLmhpZGRlbkRhdGVzKSxnPWUuaXNIaWRkZW4oaS5yYW5nZS5lbmQsaS5oaWRkZW5EYXRlcykseT1pLnJhbmdlLnN0YXJ0LGI9aS5yYW5nZS5lbmQ7MT09di5oaWRkZW4mJih5PTE9PWkucmFuZ2Uuc3RhcnRUb0Zyb250P3Yuc3RhcnREYXRlLTE6di5lbmREYXRlKzEpLDE9PWcuaGlkZGVuJiYoYj0xPT1pLnJhbmdlLmVuZFRvRnJvbnQ/Zy5zdGFydERhdGUtMTpnLmVuZERhdGUrMSksMSE9di5oaWRkZW4mJjEhPWcuaGlkZGVufHxpLnJhbmdlLl9hcHBseVJhbmdlKHksYil9fSxlLnJlbW92ZUR1cGxpY2F0ZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaGlkZGVuRGF0ZXMsaT1bXSxvPTA7bzxlLmxlbmd0aDtvKyspZm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspbyE9biYmMSE9ZVtuXS5yZW1vdmUmJjEhPWVbb10ucmVtb3ZlJiYoZVtuXS5zdGFydD49ZVtvXS5zdGFydCYmZVtuXS5lbmQ8PWVbb10uZW5kP2Vbbl0ucmVtb3ZlPSEwOmVbbl0uc3RhcnQ+PWVbb10uc3RhcnQmJmVbbl0uc3RhcnQ8PWVbb10uZW5kPyhlW29dLmVuZD1lW25dLmVuZCxlW25dLnJlbW92ZT0hMCk6ZVtuXS5lbmQ+PWVbb10uc3RhcnQmJmVbbl0uZW5kPD1lW29dLmVuZCYmKGVbb10uc3RhcnQ9ZVtuXS5zdGFydCxlW25dLnJlbW92ZT0hMCkpO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKSEwIT09ZVtvXS5yZW1vdmUmJmkucHVzaChlW29dKTt0LmhpZGRlbkRhdGVzPWksdC5oaWRkZW5EYXRlcy5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc3RhcnQtZS5zdGFydH0pfSxlLnByaW50RGF0ZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspY29uc29sZS5sb2coZSxuZXcgRGF0ZSh0W2VdLnN0YXJ0KSxuZXcgRGF0ZSh0W2VdLmVuZCksdFtlXS5zdGFydCx0W2VdLmVuZCx0W2VdLnJlbW92ZSl9LGUuc3RlcE92ZXJIaWRkZW5EYXRlcz1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBvPSExLG49ZS5jdXJyZW50LnZhbHVlT2YoKSxzPTA7czxlLmhpZGRlbkRhdGVzLmxlbmd0aDtzKyspe3ZhciByPWUuaGlkZGVuRGF0ZXNbc10uc3RhcnQsYT1lLmhpZGRlbkRhdGVzW3NdLmVuZDtpZihuPj1yJiZuPGEpe289ITA7YnJlYWt9fWlmKDE9PW8mJm48ZS5fZW5kLnZhbHVlT2YoKSYmbiE9aSl7dmFyIGg9dChpKSxkPXQoYSk7aC55ZWFyKCkhPWQueWVhcigpP2Uuc3dpdGNoZWRZZWFyPSEwOmgubW9udGgoKSE9ZC5tb250aCgpP2Uuc3dpdGNoZWRNb250aD0hMDpoLmRheU9mWWVhcigpIT1kLmRheU9mWWVhcigpJiYoZS5zd2l0Y2hlZERheT0hMCksZS5jdXJyZW50PWR9fSxlLnRvU2NyZWVuPWZ1bmN0aW9uKHQsaSxvKXtpZigwPT10LmJvZHkuaGlkZGVuRGF0ZXMubGVuZ3RoKXt2YXIgbj10LnJhbmdlLmNvbnZlcnNpb24obyk7cmV0dXJuKGkudmFsdWVPZigpLW4ub2Zmc2V0KSpuLnNjYWxlfXZhciBzPWUuaXNIaWRkZW4oaSx0LmJvZHkuaGlkZGVuRGF0ZXMpOzE9PXMuaGlkZGVuJiYoaT1zLnN0YXJ0RGF0ZSk7dmFyIHI9ZS5nZXRIaWRkZW5EdXJhdGlvbkJldHdlZW4odC5ib2R5LmhpZGRlbkRhdGVzLHQucmFuZ2Uuc3RhcnQsdC5yYW5nZS5lbmQpO2lmKGk8dC5yYW5nZS5zdGFydCl7dmFyIG49dC5yYW5nZS5jb252ZXJzaW9uKG8sciksYT1lLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlU3RhcnQodC5ib2R5LmhpZGRlbkRhdGVzLGksbi5vZmZzZXQpO3JldHVybiBpPXQub3B0aW9ucy5tb21lbnQoaSkudG9EYXRlKCkudmFsdWVPZigpLGkrPWEsLShuLm9mZnNldC1pLnZhbHVlT2YoKSkqbi5zY2FsZX1pZihpPnQucmFuZ2UuZW5kKXt2YXIgaD17c3RhcnQ6dC5yYW5nZS5zdGFydCxlbmQ6aX07aT1lLmNvcnJlY3RUaW1lRm9ySGlkZGVuKHQub3B0aW9ucy5tb21lbnQsdC5ib2R5LmhpZGRlbkRhdGVzLGgsaSk7dmFyIG49dC5yYW5nZS5jb252ZXJzaW9uKG8scik7cmV0dXJuKGkudmFsdWVPZigpLW4ub2Zmc2V0KSpuLnNjYWxlfWk9ZS5jb3JyZWN0VGltZUZvckhpZGRlbih0Lm9wdGlvbnMubW9tZW50LHQuYm9keS5oaWRkZW5EYXRlcyx0LnJhbmdlLGkpO3ZhciBuPXQucmFuZ2UuY29udmVyc2lvbihvLHIpO3JldHVybihpLnZhbHVlT2YoKS1uLm9mZnNldCkqbi5zY2FsZX0sZS50b1RpbWU9ZnVuY3Rpb24odCxpLG8pe2lmKDA9PXQuYm9keS5oaWRkZW5EYXRlcy5sZW5ndGgpe3ZhciBuPXQucmFuZ2UuY29udmVyc2lvbihvKTtyZXR1cm4gbmV3IERhdGUoaS9uLnNjYWxlK24ub2Zmc2V0KX12YXIgcz1lLmdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbih0LmJvZHkuaGlkZGVuRGF0ZXMsdC5yYW5nZS5zdGFydCx0LnJhbmdlLmVuZCkscj10LnJhbmdlLmVuZC10LnJhbmdlLnN0YXJ0LXMsYT1yKmkvbyxoPWUuZ2V0QWNjdW11bGF0ZWRIaWRkZW5EdXJhdGlvbih0LmJvZHkuaGlkZGVuRGF0ZXMsdC5yYW5nZSxhKTtyZXR1cm4gbmV3IERhdGUoaCthK3QucmFuZ2Uuc3RhcnQpfSxlLmdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbj1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBvPTAsbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcz10W25dLnN0YXJ0LHI9dFtuXS5lbmQ7cz49ZSYmcjxpJiYobys9ci1zKX1yZXR1cm4gb30sZS5nZXRIaWRkZW5EdXJhdGlvbkJlZm9yZVN0YXJ0PWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl0uc3RhcnQscj10W25dLmVuZDtzPj1lJiZyPD1pJiYobys9ci1zKX1yZXR1cm4gb30sZS5jb3JyZWN0VGltZUZvckhpZGRlbj1mdW5jdGlvbih0LGksbyxuKXtyZXR1cm4gbj10KG4pLnRvRGF0ZSgpLnZhbHVlT2YoKSxuLT1lLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlKHQsaSxvLG4pfSxlLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlPWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPTA7bz10KG8pLnRvRGF0ZSgpLnZhbHVlT2YoKTtmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9ZVtzXS5zdGFydCxhPWVbc10uZW5kO3I+PWkuc3RhcnQmJmE8aS5lbmQmJm8+PWEmJihuKz1hLXIpfXJldHVybiBufSxlLmdldEFjY3VtdWxhdGVkSGlkZGVuRHVyYXRpb249ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbz0wLG49MCxzPWUuc3RhcnQscj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgYT10W3JdLnN0YXJ0LGg9dFtyXS5lbmQ7aWYoYT49ZS5zdGFydCYmaDxlLmVuZCl7aWYobis9YS1zLHM9aCxuPj1pKWJyZWFrO28rPWgtYX19cmV0dXJuIG99LGUuc25hcEF3YXlGcm9tSGlkZGVuPWZ1bmN0aW9uKHQsaSxvLG4pe3ZhciBzPWUuaXNIaWRkZW4oaSx0KTtyZXR1cm4gMT09cy5oaWRkZW4/bzwwPzE9PW4/cy5zdGFydERhdGUtKHMuZW5kRGF0ZS1pKS0xOnMuc3RhcnREYXRlLTE6MT09bj9zLmVuZERhdGUrKGktcy5zdGFydERhdGUpKzE6cy5lbmREYXRlKzE6aX0sZS5pc0hpZGRlbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldLnN0YXJ0LG49ZVtpXS5lbmQ7aWYodD49byYmdDxuKXJldHVybntoaWRkZW46ITAsc3RhcnREYXRlOm8sZW5kRGF0ZTpufX1yZXR1cm57aGlkZGVuOiExLHN0YXJ0RGF0ZTpvLGVuZERhdGU6bn19fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbigpe312YXIgcz1pKDkwKSxyPW8ocyksYT1pKDYyKSxoPW8oYSksZD1pKDk5KSxsPWkoMTEyKSx1PWkoMTE5KSxjPWkoMSkscD0oaSg4OSksaSg5MyksaSgxMTgpLGkoMTIzKSxpKDEzOSkpLGY9aSgxNDApLG09aSgxMjEpLHY9aSgxNDEpO2Qobi5wcm90b3R5cGUpLG4ucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtpZih0aGlzLmlzQWN0aXZlKCkmJnRoaXMuZW1pdCgibW91c2V3aGVlbCIsdCksdGhpcy5vcHRpb25zLnZlcnRpY2FsU2Nyb2xsJiYhdGhpcy5vcHRpb25zLmhvcml6b250YWxTY3JvbGwmJnRoaXMub3B0aW9ucy56b29tS2V5JiYhdFt0aGlzLm9wdGlvbnMuem9vbUtleV0pe3QucHJldmVudERlZmF1bHQoKTt2YXIgZT0wO3Qud2hlZWxEZWx0YT9lPXQud2hlZWxEZWx0YS8xMjA6dC5kZXRhaWwmJihlPS10LmRldGFpbC8zKTt2YXIgaT10aGlzLnByb3BzLnNjcm9sbFRvcCxvPWkrMTIwKmU7dGhpcy5pc0FjdGl2ZSgpJiYodGhpcy5fc2V0U2Nyb2xsVG9wKG8pLHRoaXMuX3JlZHJhdygpLHRoaXMuZW1pdCgic2Nyb2xsIix0KSl9fWZ1bmN0aW9uIGkodCl7aWYocy5vcHRpb25zLnZlcnRpY2FsU2Nyb2xsJiYodC5wcmV2ZW50RGVmYXVsdCgpLHMuaXNBY3RpdmUoKSkpe3ZhciBlPS10LnRhcmdldC5zY3JvbGxUb3A7cy5fc2V0U2Nyb2xsVG9wKGUpLHMuX3JlZHJhdygpLHMuZW1pdCgic2Nyb2xsU2lkZSIsdCl9fWZ1bmN0aW9uIG8odCl7aWYodC5wcmV2ZW50RGVmYXVsdCYmdC5wcmV2ZW50RGVmYXVsdCgpLCEoIXQudGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCJ2aXMiKT4tMXx8YSkpcmV0dXJuIHQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9Im1vdmUiLGE9ITAsITF9ZnVuY3Rpb24gbih0KXt0LnByZXZlbnREZWZhdWx0JiZ0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24mJnQuc3RvcFByb3BhZ2F0aW9uKCk7dHJ5e2lmKCFKU09OLnBhcnNlKHQuZGF0YVRyYW5zZmVyLmdldERhdGEoInRleHQiKSkuY29udGVudClyZXR1cm59Y2F0Y2godCl7cmV0dXJuITF9cmV0dXJuIGE9ITEsdC5jZW50ZXI9e3g6dC5jbGllbnRYLHk6dC5jbGllbnRZfSxzLml0ZW1TZXQuX29uQWRkSXRlbSh0KSxzLmVtaXQoImRyb3AiLHMuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKSwhMX10aGlzLmRvbT17fSx0aGlzLmRvbS5jb250YWluZXI9dCx0aGlzLmRvbS5yb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmJhY2tncm91bmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uYmFja2dyb3VuZFZlcnRpY2FsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmJhY2tncm91bmRIb3Jpem9udGFsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5sZWZ0Q29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLnJpZ2h0Q29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmNlbnRlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5sZWZ0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLnJpZ2h0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLnRvcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5ib3R0b209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uc2hhZG93VG9wPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLnNoYWRvd0JvdHRvbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5zaGFkb3dUb3BMZWZ0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLnNoYWRvd0JvdHRvbUxlZnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uc2hhZG93VG9wUmlnaHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uc2hhZG93Qm90dG9tUmlnaHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20ucm9sbGluZ01vZGVCdG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20ucm9vdC5jbGFzc05hbWU9InZpcy10aW1lbGluZSIsdGhpcy5kb20uYmFja2dyb3VuZC5jbGFzc05hbWU9InZpcy1wYW5lbCB2aXMtYmFja2dyb3VuZCIsdGhpcy5kb20uYmFja2dyb3VuZFZlcnRpY2FsLmNsYXNzTmFtZT0idmlzLXBhbmVsIHZpcy1iYWNrZ3JvdW5kIHZpcy12ZXJ0aWNhbCIsdGhpcy5kb20uYmFja2dyb3VuZEhvcml6b250YWwuY2xhc3NOYW1lPSJ2aXMtcGFuZWwgdmlzLWJhY2tncm91bmQgdmlzLWhvcml6b250YWwiLHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lci5jbGFzc05hbWU9InZpcy1wYW5lbCB2aXMtY2VudGVyIix0aGlzLmRvbS5sZWZ0Q29udGFpbmVyLmNsYXNzTmFtZT0idmlzLXBhbmVsIHZpcy1sZWZ0Iix0aGlzLmRvbS5yaWdodENvbnRhaW5lci5jbGFzc05hbWU9InZpcy1wYW5lbCB2aXMtcmlnaHQiLHRoaXMuZG9tLnRvcC5jbGFzc05hbWU9InZpcy1wYW5lbCB2aXMtdG9wIix0aGlzLmRvbS5ib3R0b20uY2xhc3NOYW1lPSJ2aXMtcGFuZWwgdmlzLWJvdHRvbSIsdGhpcy5kb20ubGVmdC5jbGFzc05hbWU9InZpcy1jb250ZW50Iix0aGlzLmRvbS5jZW50ZXIuY2xhc3NOYW1lPSJ2aXMtY29udGVudCIsdGhpcy5kb20ucmlnaHQuY2xhc3NOYW1lPSJ2aXMtY29udGVudCIsdGhpcy5kb20uc2hhZG93VG9wLmNsYXNzTmFtZT0idmlzLXNoYWRvdyB2aXMtdG9wIix0aGlzLmRvbS5zaGFkb3dCb3R0b20uY2xhc3NOYW1lPSJ2aXMtc2hhZG93IHZpcy1ib3R0b20iLHRoaXMuZG9tLnNoYWRvd1RvcExlZnQuY2xhc3NOYW1lPSJ2aXMtc2hhZG93IHZpcy10b3AiLHRoaXMuZG9tLnNoYWRvd0JvdHRvbUxlZnQuY2xhc3NOYW1lPSJ2aXMtc2hhZG93IHZpcy1ib3R0b20iLHRoaXMuZG9tLnNoYWRvd1RvcFJpZ2h0LmNsYXNzTmFtZT0idmlzLXNoYWRvdyB2aXMtdG9wIix0aGlzLmRvbS5zaGFkb3dCb3R0b21SaWdodC5jbGFzc05hbWU9InZpcy1zaGFkb3cgdmlzLWJvdHRvbSIsdGhpcy5kb20ucm9sbGluZ01vZGVCdG4uY2xhc3NOYW1lPSJ2aXMtcm9sbGluZy1tb2RlLWJ0biIsdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kKSx0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJhY2tncm91bmRWZXJ0aWNhbCksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kSG9yaXpvbnRhbCksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIpLHRoaXMuZG9tLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5kb20ubGVmdENvbnRhaW5lciksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5yaWdodENvbnRhaW5lciksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS50b3ApLHRoaXMuZG9tLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5kb20uYm90dG9tKSx0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJvdHRvbSksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5yb2xsaW5nTW9kZUJ0biksdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNlbnRlciksdGhpcy5kb20ubGVmdENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sZWZ0KSx0aGlzLmRvbS5yaWdodENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5yaWdodCksdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd1RvcCksdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd0JvdHRvbSksdGhpcy5kb20ubGVmdENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dUb3BMZWZ0KSx0aGlzLmRvbS5sZWZ0Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd0JvdHRvbUxlZnQpLHRoaXMuZG9tLnJpZ2h0Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd1RvcFJpZ2h0KSx0aGlzLmRvbS5yaWdodENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dCb3R0b21SaWdodCksdGhpcy5wcm9wcz17cm9vdDp7fSxiYWNrZ3JvdW5kOnt9LGNlbnRlckNvbnRhaW5lcjp7fSxsZWZ0Q29udGFpbmVyOnt9LHJpZ2h0Q29udGFpbmVyOnt9LGNlbnRlcjp7fSxsZWZ0Ont9LHJpZ2h0Ont9LHRvcDp7fSxib3R0b206e30sYm9yZGVyOnt9LHNjcm9sbFRvcDowLHNjcm9sbFRvcE1pbjowfSx0aGlzLm9uKCJyYW5nZWNoYW5nZSIsZnVuY3Rpb24oKXshMD09PXRoaXMuaW5pdGlhbERyYXdEb25lJiZ0aGlzLl9yZWRyYXcoKX0uYmluZCh0aGlzKSksdGhpcy5vbigidG91Y2giLHRoaXMuX29uVG91Y2guYmluZCh0aGlzKSksdGhpcy5vbigicGFubW92ZSIsdGhpcy5fb25EcmFnLmJpbmQodGhpcykpO3ZhciBzPXRoaXM7dGhpcy5fb3JpZ1JlZHJhdz10aGlzLl9yZWRyYXcuYmluZCh0aGlzKSx0aGlzLl9yZWRyYXc9Yy50aHJvdHRsZSh0aGlzLl9vcmlnUmVkcmF3KSx0aGlzLm9uKCJfY2hhbmdlIixmdW5jdGlvbih0KXtzLml0ZW1TZXQmJnMuaXRlbVNldC5pbml0aWFsSXRlbVNldERyYXduJiZ0JiYxPT10LnF1ZXVlP3MuX3JlZHJhdygpOnMuX29yaWdSZWRyYXcoKX0pLHRoaXMuaGFtbWVyPW5ldyBsKHRoaXMuZG9tLnJvb3QpO3ZhciByPXRoaXMuaGFtbWVyLmdldCgicGluY2giKS5zZXQoe2VuYWJsZTohMH0pO3UuZGlzYWJsZVByZXZlbnREZWZhdWx0VmVydGljYWxseShyKSx0aGlzLmhhbW1lci5nZXQoInBhbiIpLnNldCh7dGhyZXNob2xkOjUsZGlyZWN0aW9uOmwuRElSRUNUSU9OX0hPUklaT05UQUx9KSx0aGlzLmxpc3RlbmVycz17fSxbInRhcCIsImRvdWJsZXRhcCIsInByZXNzIiwicGluY2giLCJwYW4iLCJwYW5zdGFydCIsInBhbm1vdmUiLCJwYW5lbmQiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUpe3MuaXNBY3RpdmUoKSYmcy5lbWl0KHQsZSl9O3MuaGFtbWVyLm9uKHQsZSkscy5saXN0ZW5lcnNbdF09ZX0pLHUub25Ub3VjaCh0aGlzLmhhbW1lcixmdW5jdGlvbih0KXtzLmVtaXQoInRvdWNoIix0KX0uYmluZCh0aGlzKSksdS5vblJlbGVhc2UodGhpcy5oYW1tZXIsZnVuY3Rpb24odCl7cy5lbWl0KCJyZWxlYXNlIix0KX0uYmluZCh0aGlzKSksdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXI/KHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIixlLmJpbmQodGhpcyksITEpLHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJET01Nb3VzZVNjcm9sbCIsZS5iaW5kKHRoaXMpLCExKSk6dGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmF0dGFjaEV2ZW50KCJvbm1vdXNld2hlZWwiLGUuYmluZCh0aGlzKSksdGhpcy5kb20ubGVmdC5wYXJlbnROb2RlLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsaS5iaW5kKHRoaXMpKSx0aGlzLmRvbS5yaWdodC5wYXJlbnROb2RlLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsaS5iaW5kKHRoaXMpKTt2YXIgYT0hMTtpZih0aGlzLmRvbS5jZW50ZXIuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLG8uYmluZCh0aGlzKSwhMSksdGhpcy5kb20uY2VudGVyLmFkZEV2ZW50TGlzdGVuZXIoImRyb3AiLG4uYmluZCh0aGlzKSwhMSksdGhpcy5jdXN0b21UaW1lcz1bXSx0aGlzLnRvdWNoPXt9LHRoaXMucmVkcmF3Q291bnQ9MCx0aGlzLmluaXRpYWxEcmF3RG9uZT0hMSwhdCl0aHJvdyBuZXcgRXJyb3IoIk5vIGNvbnRhaW5lciBwcm92aWRlZCIpO3QuYXBwZW5kQ2hpbGQodGhpcy5kb20ucm9vdCl9LG4ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9WyJ3aWR0aCIsImhlaWdodCIsIm1pbkhlaWdodCIsIm1heEhlaWdodCIsImF1dG9SZXNpemUiLCJzdGFydCIsImVuZCIsImNsaWNrVG9Vc2UiLCJkYXRhQXR0cmlidXRlcyIsImhpZGRlbkRhdGVzIiwibG9jYWxlIiwibG9jYWxlcyIsIm1vbWVudCIsInJ0bCIsInpvb21LZXkiLCJob3Jpem9udGFsU2Nyb2xsIiwidmVydGljYWxTY3JvbGwiXTtpZihjLnNlbGVjdGl2ZUV4dGVuZChlLHRoaXMub3B0aW9ucyx0KSx0aGlzLmRvbS5yb2xsaW5nTW9kZUJ0bi5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLHRoaXMub3B0aW9ucy5ydGwmJih0aGlzLmRvbS5jb250YWluZXIuc3R5bGUuZGlyZWN0aW9uPSJydGwiLHRoaXMuZG9tLmJhY2tncm91bmRWZXJ0aWNhbC5jbGFzc05hbWU9InZpcy1wYW5lbCB2aXMtYmFja2dyb3VuZCB2aXMtdmVydGljYWwtcnRsIiksdGhpcy5vcHRpb25zLnZlcnRpY2FsU2Nyb2xsJiYodGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5yaWdodENvbnRhaW5lci5jbGFzc05hbWU9InZpcy1wYW5lbCB2aXMtcmlnaHQgdmlzLXZlcnRpY2FsLXNjcm9sbCI6dGhpcy5kb20ubGVmdENvbnRhaW5lci5jbGFzc05hbWU9InZpcy1wYW5lbCB2aXMtbGVmdCB2aXMtdmVydGljYWwtc2Nyb2xsIiksdGhpcy5vcHRpb25zLm9yaWVudGF0aW9uPXtpdGVtOnZvaWQgMCxheGlzOnZvaWQgMH0sIm9yaWVudGF0aW9uImluIHQmJigic3RyaW5nIj09dHlwZW9mIHQub3JpZW50YXRpb24/dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uPXtpdGVtOnQub3JpZW50YXRpb24sYXhpczp0Lm9yaWVudGF0aW9ufToib2JqZWN0Ij09PSgwLGguZGVmYXVsdCkodC5vcmllbnRhdGlvbikmJigiaXRlbSJpbiB0Lm9yaWVudGF0aW9uJiYodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW09dC5vcmllbnRhdGlvbi5pdGVtKSwiYXhpcyJpbiB0Lm9yaWVudGF0aW9uJiYodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXM9dC5vcmllbnRhdGlvbi5heGlzKSkpLCJib3RoIj09PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzKXtpZighdGhpcy50aW1lQXhpczIpe3ZhciBpPXRoaXMudGltZUF4aXMyPW5ldyBwKHRoaXMuYm9keSk7aS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPXQ/Yy5leHRlbmQoe30sdCk6e307ZS5vcmllbnRhdGlvbj0idG9wIixwLnByb3RvdHlwZS5zZXRPcHRpb25zLmNhbGwoaSxlKX0sdGhpcy5jb21wb25lbnRzLnB1c2goaSl9fWVsc2UgaWYodGhpcy50aW1lQXhpczIpe3ZhciBvPXRoaXMuY29tcG9uZW50cy5pbmRleE9mKHRoaXMudGltZUF4aXMyKTstMSE9PW8mJnRoaXMuY29tcG9uZW50cy5zcGxpY2UobywxKSx0aGlzLnRpbWVBeGlzMi5kZXN0cm95KCksdGhpcy50aW1lQXhpczI9bnVsbH1pZigiZnVuY3Rpb24iPT10eXBlb2YgdC5kcmF3UG9pbnRzJiYodC5kcmF3UG9pbnRzPXtvblJlbmRlcjp0LmRyYXdQb2ludHN9KSwiaGlkZGVuRGF0ZXMiaW4gdGhpcy5vcHRpb25zJiZtLmNvbnZlcnRIaWRkZW5PcHRpb25zKHRoaXMub3B0aW9ucy5tb21lbnQsdGhpcy5ib2R5LHRoaXMub3B0aW9ucy5oaWRkZW5EYXRlcyksImNsaWNrVG9Vc2UiaW4gdCYmKHQuY2xpY2tUb1VzZT90aGlzLmFjdGl2YXRvcnx8KHRoaXMuYWN0aXZhdG9yPW5ldyBmKHRoaXMuZG9tLnJvb3QpKTp0aGlzLmFjdGl2YXRvciYmKHRoaXMuYWN0aXZhdG9yLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5hY3RpdmF0b3IpKSwic2hvd0N1c3RvbVRpbWUiaW4gdCl0aHJvdyBuZXcgRXJyb3IoIk9wdGlvbiBgc2hvd0N1c3RvbVRpbWVgIGlzIGRlcHJlY2F0ZWQuIENyZWF0ZSBhIGN1c3RvbSB0aW1lIGJhciB2aWEgdGltZWxpbmUuYWRkQ3VzdG9tVGltZSh0aW1lIFssIGlkXSkiKTt0aGlzLl9pbml0QXV0b1Jlc2l6ZSgpfWlmKHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNldE9wdGlvbnModCl9KSwiY29uZmlndXJlImluIHQpe3RoaXMuY29uZmlndXJhdG9yfHwodGhpcy5jb25maWd1cmF0b3I9dGhpcy5fY3JlYXRlQ29uZmlndXJhdG9yKCkpLHRoaXMuY29uZmlndXJhdG9yLnNldE9wdGlvbnModC5jb25maWd1cmUpO3ZhciBuPWMuZGVlcEV4dGVuZCh7fSx0aGlzLm9wdGlvbnMpO3RoaXMuY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2MuZGVlcEV4dGVuZChuLHQub3B0aW9ucyl9KSx0aGlzLmNvbmZpZ3VyYXRvci5zZXRNb2R1bGVPcHRpb25zKHtnbG9iYWw6bn0pfXRoaXMuX3JlZHJhdygpfSxuLnByb3RvdHlwZS5pc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiF0aGlzLmFjdGl2YXRvcnx8dGhpcy5hY3RpdmF0b3IuYWN0aXZlfSxuLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5zZXRJdGVtcyhudWxsKSx0aGlzLnNldEdyb3VwcyhudWxsKSx0aGlzLm9mZigpLHRoaXMuX3N0b3BBdXRvUmVzaXplKCksdGhpcy5kb20ucm9vdC5wYXJlbnROb2RlJiZ0aGlzLmRvbS5yb290LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ucm9vdCksdGhpcy5kb209bnVsbCx0aGlzLmFjdGl2YXRvciYmKHRoaXMuYWN0aXZhdG9yLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5hY3RpdmF0b3IpO2Zvcih2YXIgdCBpbiB0aGlzLmxpc3RlbmVycyl0aGlzLmxpc3RlbmVycy5oYXNPd25Qcm9wZXJ0eSh0KSYmZGVsZXRlIHRoaXMubGlzdGVuZXJzW3RdO3RoaXMubGlzdGVuZXJzPW51bGwsdGhpcy5oYW1tZXI9bnVsbCx0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC5kZXN0cm95KCl9KSx0aGlzLmJvZHk9bnVsbH0sbi5wcm90b3R5cGUuc2V0Q3VzdG9tVGltZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuY3VzdG9tVGltZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBlPT09dC5vcHRpb25zLmlkfSk7aWYoMD09PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTm8gY3VzdG9tIHRpbWUgYmFyIGZvdW5kIHdpdGggaWQgIisoMCxyLmRlZmF1bHQpKGUpKTtpLmxlbmd0aD4wJiZpWzBdLnNldEN1c3RvbVRpbWUodCl9LG4ucHJvdG90eXBlLmdldEN1c3RvbVRpbWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jdXN0b21UaW1lcy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUub3B0aW9ucy5pZD09PXR9KTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCAiKygwLHIuZGVmYXVsdCkodCkpO3JldHVybiBlWzBdLmdldEN1c3RvbVRpbWUoKX0sbi5wcm90b3R5cGUuc2V0Q3VzdG9tVGltZVRpdGxlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5jdXN0b21UaW1lcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQub3B0aW9ucy5pZD09PWV9KTtpZigwPT09aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCAiKygwLHIuZGVmYXVsdCkoZSkpO2lmKGkubGVuZ3RoPjApcmV0dXJuIGlbMF0uc2V0Q3VzdG9tVGl0bGUodCl9LG4ucHJvdG90eXBlLmdldEV2ZW50UHJvcGVydGllcz1mdW5jdGlvbih0KXtyZXR1cm57ZXZlbnQ6dH19LG4ucHJvdG90eXBlLmFkZEN1c3RvbVRpbWU9ZnVuY3Rpb24odCxlKXt2YXIgaT12b2lkIDAhPT10P2MuY29udmVydCh0LCJEYXRlIikudmFsdWVPZigpOm5ldyBEYXRlO2lmKHRoaXMuY3VzdG9tVGltZXMuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gdC5vcHRpb25zLmlkPT09ZX0pKXRocm93IG5ldyBFcnJvcigiQSBjdXN0b20gdGltZSB3aXRoIGlkICIrKDAsci5kZWZhdWx0KShlKSsiIGFscmVhZHkgZXhpc3RzIik7dmFyIG89bmV3IHYodGhpcy5ib2R5LGMuZXh0ZW5kKHt9LHRoaXMub3B0aW9ucyx7dGltZTppLGlkOmV9KSk7cmV0dXJuIHRoaXMuY3VzdG9tVGltZXMucHVzaChvKSx0aGlzLmNvbXBvbmVudHMucHVzaChvKSx0aGlzLl9yZWRyYXcoKSxlfSxuLnByb3RvdHlwZS5yZW1vdmVDdXN0b21UaW1lPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3VzdG9tVGltZXMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLm9wdGlvbnMuaWQ9PT10fSk7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTm8gY3VzdG9tIHRpbWUgYmFyIGZvdW5kIHdpdGggaWQgIisoMCxyLmRlZmF1bHQpKHQpKTtlLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy5jdXN0b21UaW1lcy5zcGxpY2UodGhpcy5jdXN0b21UaW1lcy5pbmRleE9mKHQpLDEpLHRoaXMuY29tcG9uZW50cy5zcGxpY2UodGhpcy5jb21wb25lbnRzLmluZGV4T2YodCksMSksdC5kZXN0cm95KCl9LmJpbmQodGhpcykpfSxuLnByb3RvdHlwZS5nZXRWaXNpYmxlSXRlbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtU2V0JiZ0aGlzLml0ZW1TZXQuZ2V0VmlzaWJsZUl0ZW1zKCl8fFtdfSxuLnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldERhdGFSYW5nZSgpO2lmKG51bGwhPT1pLm1pbnx8bnVsbCE9PWkubWF4KXt2YXIgbz1pLm1heC1pLm1pbixuPW5ldyBEYXRlKGkubWluLnZhbHVlT2YoKS0uMDEqbykscz1uZXcgRGF0ZShpLm1heC52YWx1ZU9mKCkrLjAxKm8pLHI9IXR8fHZvaWQgMD09PXQuYW5pbWF0aW9ufHx0LmFuaW1hdGlvbjt0aGlzLnJhbmdlLnNldFJhbmdlKG4scyx7YW5pbWF0aW9uOnJ9LGUpfX0sbi5wcm90b3R5cGUuZ2V0RGF0YVJhbmdlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGFic3RyYWN0IG1ldGhvZCBnZXREYXRhUmFuZ2UiKX0sbi5wcm90b3R5cGUuc2V0V2luZG93PWZ1bmN0aW9uKHQsZSxpLG8peyJmdW5jdGlvbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJihvPWFyZ3VtZW50c1syXSxpPXt9KTt2YXIgbjtpZigxPT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcz1hcmd1bWVudHNbMF07bj12b2lkIDA9PT1zLmFuaW1hdGlvbnx8cy5hbmltYXRpb24sdGhpcy5yYW5nZS5zZXRSYW5nZShzLnN0YXJ0LHMuZW5kLHthbmltYXRpb246bn0pfWVsc2UgaWYoMj09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHM9YXJndW1lbnRzWzBdO289YXJndW1lbnRzWzFdLG49dm9pZCAwPT09cy5hbmltYXRpb258fHMuYW5pbWF0aW9uLHRoaXMucmFuZ2Uuc2V0UmFuZ2Uocy5zdGFydCxzLmVuZCx7YW5pbWF0aW9uOm59LG8pfWVsc2Ugbj0haXx8dm9pZCAwPT09aS5hbmltYXRpb258fGkuYW5pbWF0aW9uLHRoaXMucmFuZ2Uuc2V0UmFuZ2UodCxlLHthbmltYXRpb246bn0sbyl9LG4ucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbih0LGUsaSl7ImZ1bmN0aW9uIj09dHlwZW9mIGFyZ3VtZW50c1sxXSYmKGk9YXJndW1lbnRzWzFdLGU9e30pO3ZhciBvPXRoaXMucmFuZ2UuZW5kLXRoaXMucmFuZ2Uuc3RhcnQsbj1jLmNvbnZlcnQodCwiRGF0ZSIpLnZhbHVlT2YoKSxzPW4tby8yLHI9bitvLzIsYT0hZXx8dm9pZCAwPT09ZS5hbmltYXRpb258fGUuYW5pbWF0aW9uO3RoaXMucmFuZ2Uuc2V0UmFuZ2UocyxyLHthbmltYXRpb246YX0saSl9LG4ucHJvdG90eXBlLmdldFdpbmRvdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMucmFuZ2UuZ2V0UmFuZ2UoKTtyZXR1cm57c3RhcnQ6bmV3IERhdGUodC5zdGFydCksZW5kOm5ldyBEYXRlKHQuZW5kKX19LG4ucHJvdG90eXBlLnpvb21Jbj1mdW5jdGlvbih0LGUsaSl7aWYoISghdHx8dDwwfHx0PjEpKXsiZnVuY3Rpb24iPT10eXBlb2YgYXJndW1lbnRzWzFdJiYoaT1hcmd1bWVudHNbMV0sZT17fSk7dmFyIG89dGhpcy5nZXRXaW5kb3coKSxuPW8uc3RhcnQudmFsdWVPZigpLHM9by5lbmQudmFsdWVPZigpLHI9cy1uLGE9ci8oMSt0KSxoPShyLWEpLzIsZD1uK2gsbD1zLWg7dGhpcy5zZXRXaW5kb3coZCxsLGUsaSl9fSxuLnByb3RvdHlwZS56b29tT3V0PWZ1bmN0aW9uKHQsZSxpKXtpZighKCF0fHx0PDB8fHQ+MSkpeyJmdW5jdGlvbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0mJihpPWFyZ3VtZW50c1sxXSxlPXt9KTt2YXIgbz10aGlzLmdldFdpbmRvdygpLG49by5zdGFydC52YWx1ZU9mKCkscz1vLmVuZC52YWx1ZU9mKCkscj1zLW4sYT1uLXIqdC8yLGg9cytyKnQvMjt0aGlzLnNldFdpbmRvdyhhLGgsZSxpKX19LG4ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3RoaXMuX3JlZHJhdygpfSxuLnByb3RvdHlwZS5fcmVkcmF3PWZ1bmN0aW9uKCl7dGhpcy5yZWRyYXdDb3VudCsrO3ZhciB0PSExLGU9dGhpcy5vcHRpb25zLGk9dGhpcy5wcm9wcyxvPXRoaXMuZG9tO2lmKG8mJm8uY29udGFpbmVyJiYwIT1vLnJvb3Qub2Zmc2V0V2lkdGgpe20udXBkYXRlSGlkZGVuRGF0ZXModGhpcy5vcHRpb25zLm1vbWVudCx0aGlzLmJvZHksdGhpcy5vcHRpb25zLmhpZGRlbkRhdGVzKSwidG9wIj09ZS5vcmllbnRhdGlvbj8oYy5hZGRDbGFzc05hbWUoby5yb290LCJ2aXMtdG9wIiksYy5yZW1vdmVDbGFzc05hbWUoby5yb290LCJ2aXMtYm90dG9tIikpOihjLnJlbW92ZUNsYXNzTmFtZShvLnJvb3QsInZpcy10b3AiKSxjLmFkZENsYXNzTmFtZShvLnJvb3QsInZpcy1ib3R0b20iKSksby5yb290LnN0eWxlLm1heEhlaWdodD1jLm9wdGlvbi5hc1NpemUoZS5tYXhIZWlnaHQsIiIpLG8ucm9vdC5zdHlsZS5taW5IZWlnaHQ9Yy5vcHRpb24uYXNTaXplKGUubWluSGVpZ2h0LCIiKSxvLnJvb3Quc3R5bGUud2lkdGg9Yy5vcHRpb24uYXNTaXplKGUud2lkdGgsIiIpLGkuYm9yZGVyLmxlZnQ9KG8uY2VudGVyQ29udGFpbmVyLm9mZnNldFdpZHRoLW8uY2VudGVyQ29udGFpbmVyLmNsaWVudFdpZHRoKS8yLGkuYm9yZGVyLnJpZ2h0PWkuYm9yZGVyLmxlZnQsaS5ib3JkZXIudG9wPShvLmNlbnRlckNvbnRhaW5lci5vZmZzZXRIZWlnaHQtby5jZW50ZXJDb250YWluZXIuY2xpZW50SGVpZ2h0KS8yLGkuYm9yZGVyLmJvdHRvbT1pLmJvcmRlci50b3AsaS5ib3JkZXJSb290SGVpZ2h0PW8ucm9vdC5vZmZzZXRIZWlnaHQtby5yb290LmNsaWVudEhlaWdodCxpLmJvcmRlclJvb3RXaWR0aD1vLnJvb3Qub2Zmc2V0V2lkdGgtby5yb290LmNsaWVudFdpZHRoLDA9PT1vLmNlbnRlckNvbnRhaW5lci5jbGllbnRIZWlnaHQmJihpLmJvcmRlci5sZWZ0PWkuYm9yZGVyLnRvcCxpLmJvcmRlci5yaWdodD1pLmJvcmRlci5sZWZ0KSwwPT09by5yb290LmNsaWVudEhlaWdodCYmKGkuYm9yZGVyUm9vdFdpZHRoPWkuYm9yZGVyUm9vdEhlaWdodCksaS5jZW50ZXIuaGVpZ2h0PW8uY2VudGVyLm9mZnNldEhlaWdodCxpLmxlZnQuaGVpZ2h0PW8ubGVmdC5vZmZzZXRIZWlnaHQsaS5yaWdodC5oZWlnaHQ9by5yaWdodC5vZmZzZXRIZWlnaHQsaS50b3AuaGVpZ2h0PW8udG9wLmNsaWVudEhlaWdodHx8LWkuYm9yZGVyLnRvcCxpLmJvdHRvbS5oZWlnaHQ9by5ib3R0b20uY2xpZW50SGVpZ2h0fHwtaS5ib3JkZXIuYm90dG9tO3ZhciBuPU1hdGgubWF4KGkubGVmdC5oZWlnaHQsaS5jZW50ZXIuaGVpZ2h0LGkucmlnaHQuaGVpZ2h0KSxzPWkudG9wLmhlaWdodCtuK2kuYm90dG9tLmhlaWdodCtpLmJvcmRlclJvb3RIZWlnaHQraS5ib3JkZXIudG9wK2kuYm9yZGVyLmJvdHRvbTtvLnJvb3Quc3R5bGUuaGVpZ2h0PWMub3B0aW9uLmFzU2l6ZShlLmhlaWdodCxzKyJweCIpLGkucm9vdC5oZWlnaHQ9by5yb290Lm9mZnNldEhlaWdodCxpLmJhY2tncm91bmQuaGVpZ2h0PWkucm9vdC5oZWlnaHQtaS5ib3JkZXJSb290SGVpZ2h0O3ZhciByPWkucm9vdC5oZWlnaHQtaS50b3AuaGVpZ2h0LWkuYm90dG9tLmhlaWdodC1pLmJvcmRlclJvb3RIZWlnaHQ7aS5jZW50ZXJDb250YWluZXIuaGVpZ2h0PXIsaS5sZWZ0Q29udGFpbmVyLmhlaWdodD1yLGkucmlnaHRDb250YWluZXIuaGVpZ2h0PWkubGVmdENvbnRhaW5lci5oZWlnaHQsaS5yb290LndpZHRoPW8ucm9vdC5vZmZzZXRXaWR0aCxpLmJhY2tncm91bmQud2lkdGg9aS5yb290LndpZHRoLWkuYm9yZGVyUm9vdFdpZHRoLHRoaXMuaW5pdGlhbERyYXdEb25lfHwoaS5zY3JvbGxiYXJXaWR0aD1jLmdldFNjcm9sbEJhcldpZHRoKCkpLGUudmVydGljYWxTY3JvbGw/ZS5ydGw/KGkubGVmdC53aWR0aD1vLmxlZnRDb250YWluZXIuY2xpZW50V2lkdGh8fC1pLmJvcmRlci5sZWZ0LGkucmlnaHQud2lkdGg9by5yaWdodENvbnRhaW5lci5jbGllbnRXaWR0aCtpLnNjcm9sbGJhcldpZHRofHwtaS5ib3JkZXIucmlnaHQpOihpLmxlZnQud2lkdGg9by5sZWZ0Q29udGFpbmVyLmNsaWVudFdpZHRoK2kuc2Nyb2xsYmFyV2lkdGh8fC1pLmJvcmRlci5sZWZ0LGkucmlnaHQud2lkdGg9by5yaWdodENvbnRhaW5lci5jbGllbnRXaWR0aHx8LWkuYm9yZGVyLnJpZ2h0KTooaS5sZWZ0LndpZHRoPW8ubGVmdENvbnRhaW5lci5jbGllbnRXaWR0aHx8LWkuYm9yZGVyLmxlZnQsaS5yaWdodC53aWR0aD1vLnJpZ2h0Q29udGFpbmVyLmNsaWVudFdpZHRofHwtaS5ib3JkZXIucmlnaHQpLHRoaXMuX3NldERPTSgpO3ZhciBhPXRoaXMuX3VwZGF0ZVNjcm9sbFRvcCgpOyJ0b3AiIT1lLm9yaWVudGF0aW9uLml0ZW0mJihhKz1NYXRoLm1heChpLmNlbnRlckNvbnRhaW5lci5oZWlnaHQtaS5jZW50ZXIuaGVpZ2h0LWkuYm9yZGVyLnRvcC1pLmJvcmRlci5ib3R0b20sMCkpLG8uY2VudGVyLnN0eWxlLnRvcD1hKyJweCI7dmFyIGg9MD09aS5zY3JvbGxUb3A/ImhpZGRlbiI6IiIsZD1pLnNjcm9sbFRvcD09aS5zY3JvbGxUb3BNaW4/ImhpZGRlbiI6IiI7by5zaGFkb3dUb3Auc3R5bGUudmlzaWJpbGl0eT1oLG8uc2hhZG93Qm90dG9tLnN0eWxlLnZpc2liaWxpdHk9ZCxvLnNoYWRvd1RvcExlZnQuc3R5bGUudmlzaWJpbGl0eT1oLG8uc2hhZG93Qm90dG9tTGVmdC5zdHlsZS52aXNpYmlsaXR5PWQsby5zaGFkb3dUb3BSaWdodC5zdHlsZS52aXNpYmlsaXR5PWgsby5zaGFkb3dCb3R0b21SaWdodC5zdHlsZS52aXNpYmlsaXR5PWQsZS52ZXJ0aWNhbFNjcm9sbCYmKG8ucmlnaHRDb250YWluZXIuY2xhc3NOYW1lPSJ2aXMtcGFuZWwgdmlzLXJpZ2h0IHZpcy12ZXJ0aWNhbC1zY3JvbGwiLG8ubGVmdENvbnRhaW5lci5jbGFzc05hbWU9InZpcy1wYW5lbCB2aXMtbGVmdCB2aXMtdmVydGljYWwtc2Nyb2xsIixvLnNoYWRvd1RvcFJpZ2h0LnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsby5zaGFkb3dCb3R0b21SaWdodC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLG8uc2hhZG93VG9wTGVmdC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLG8uc2hhZG93Qm90dG9tTGVmdC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLG8ubGVmdC5zdHlsZS50b3A9IjBweCIsby5yaWdodC5zdHlsZS50b3A9IjBweCIpLCghZS52ZXJ0aWNhbFNjcm9sbHx8aS5jZW50ZXIuaGVpZ2h0PGkuY2VudGVyQ29udGFpbmVyLmhlaWdodCkmJihvLmxlZnQuc3R5bGUudG9wPWErInB4IixvLnJpZ2h0LnN0eWxlLnRvcD1hKyJweCIsby5yaWdodENvbnRhaW5lci5jbGFzc05hbWU9by5yaWdodENvbnRhaW5lci5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKCIoPzpefFxccyl2aXMtdmVydGljYWwtc2Nyb2xsKD86XFxzfCQpIiksIiAiKSxvLmxlZnRDb250YWluZXIuY2xhc3NOYW1lPW8ubGVmdENvbnRhaW5lci5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKCIoPzpefFxccyl2aXMtdmVydGljYWwtc2Nyb2xsKD86XFxzfCQpIiksIiAiKSxpLmxlZnQud2lkdGg9by5sZWZ0Q29udGFpbmVyLmNsaWVudFdpZHRofHwtaS5ib3JkZXIubGVmdCxpLnJpZ2h0LndpZHRoPW8ucmlnaHRDb250YWluZXIuY2xpZW50V2lkdGh8fC1pLmJvcmRlci5yaWdodCx0aGlzLl9zZXRET00oKSk7dmFyIHU9aS5jZW50ZXIuaGVpZ2h0PmkuY2VudGVyQ29udGFpbmVyLmhlaWdodDt0aGlzLmhhbW1lci5nZXQoInBhbiIpLnNldCh7ZGlyZWN0aW9uOnU/bC5ESVJFQ1RJT05fQUxMOmwuRElSRUNUSU9OX0hPUklaT05UQUx9KSx0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbihlKXt0PWUucmVkcmF3KCl8fHR9KTtpZih0KXtpZih0aGlzLnJlZHJhd0NvdW50PDUpcmV0dXJuIHZvaWQgdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2NoYW5nZSIpO2NvbnNvbGUubG9nKCJXQVJOSU5HOiBpbmZpbml0ZSBsb29wIGluIHJlZHJhdz8iKX1lbHNlIHRoaXMucmVkcmF3Q291bnQ9MDt0aGlzLmluaXRpYWxEcmF3RG9uZT0hMCx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJjaGFuZ2VkIil9fSxuLnByb3RvdHlwZS5fc2V0RE9NPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPXRoaXMuZG9tO3QubGVmdENvbnRhaW5lci53aWR0aD10LmxlZnQud2lkdGgsdC5yaWdodENvbnRhaW5lci53aWR0aD10LnJpZ2h0LndpZHRoO3ZhciBpPXQucm9vdC53aWR0aC10LmxlZnQud2lkdGgtdC5yaWdodC53aWR0aC10LmJvcmRlclJvb3RXaWR0aDt0LmNlbnRlci53aWR0aD1pLHQuY2VudGVyQ29udGFpbmVyLndpZHRoPWksdC50b3Aud2lkdGg9aSx0LmJvdHRvbS53aWR0aD1pLGUuYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQ9dC5iYWNrZ3JvdW5kLmhlaWdodCsicHgiLGUuYmFja2dyb3VuZFZlcnRpY2FsLnN0eWxlLmhlaWdodD10LmJhY2tncm91bmQuaGVpZ2h0KyJweCIsZS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5zdHlsZS5oZWlnaHQ9dC5jZW50ZXJDb250YWluZXIuaGVpZ2h0KyJweCIsZS5jZW50ZXJDb250YWluZXIuc3R5bGUuaGVpZ2h0PXQuY2VudGVyQ29udGFpbmVyLmhlaWdodCsicHgiLGUubGVmdENvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dC5sZWZ0Q29udGFpbmVyLmhlaWdodCsicHgiLGUucmlnaHRDb250YWluZXIuc3R5bGUuaGVpZ2h0PXQucmlnaHRDb250YWluZXIuaGVpZ2h0KyJweCIsZS5iYWNrZ3JvdW5kLnN0eWxlLndpZHRoPXQuYmFja2dyb3VuZC53aWR0aCsicHgiLGUuYmFja2dyb3VuZFZlcnRpY2FsLnN0eWxlLndpZHRoPXQuY2VudGVyQ29udGFpbmVyLndpZHRoKyJweCIsZS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5zdHlsZS53aWR0aD10LmJhY2tncm91bmQud2lkdGgrInB4IixlLmNlbnRlckNvbnRhaW5lci5zdHlsZS53aWR0aD10LmNlbnRlci53aWR0aCsicHgiLGUudG9wLnN0eWxlLndpZHRoPXQudG9wLndpZHRoKyJweCIsZS5ib3R0b20uc3R5bGUud2lkdGg9dC5ib3R0b20ud2lkdGgrInB4IixlLmJhY2tncm91bmQuc3R5bGUubGVmdD0iMCIsZS5iYWNrZ3JvdW5kLnN0eWxlLnRvcD0iMCIsZS5iYWNrZ3JvdW5kVmVydGljYWwuc3R5bGUubGVmdD10LmxlZnQud2lkdGgrdC5ib3JkZXIubGVmdCsicHgiLGUuYmFja2dyb3VuZFZlcnRpY2FsLnN0eWxlLnRvcD0iMCIsZS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5zdHlsZS5sZWZ0PSIwIixlLmJhY2tncm91bmRIb3Jpem9udGFsLnN0eWxlLnRvcD10LnRvcC5oZWlnaHQrInB4IixlLmNlbnRlckNvbnRhaW5lci5zdHlsZS5sZWZ0PXQubGVmdC53aWR0aCsicHgiLGUuY2VudGVyQ29udGFpbmVyLnN0eWxlLnRvcD10LnRvcC5oZWlnaHQrInB4IixlLmxlZnRDb250YWluZXIuc3R5bGUubGVmdD0iMCIsZS5sZWZ0Q29udGFpbmVyLnN0eWxlLnRvcD10LnRvcC5oZWlnaHQrInB4IixlLnJpZ2h0Q29udGFpbmVyLnN0eWxlLmxlZnQ9dC5sZWZ0LndpZHRoK3QuY2VudGVyLndpZHRoKyJweCIsZS5yaWdodENvbnRhaW5lci5zdHlsZS50b3A9dC50b3AuaGVpZ2h0KyJweCIsZS50b3Auc3R5bGUubGVmdD10LmxlZnQud2lkdGgrInB4IixlLnRvcC5zdHlsZS50b3A9IjAiLGUuYm90dG9tLnN0eWxlLmxlZnQ9dC5sZWZ0LndpZHRoKyJweCIsZS5ib3R0b20uc3R5bGUudG9wPXQudG9wLmhlaWdodCt0LmNlbnRlckNvbnRhaW5lci5oZWlnaHQrInB4IixlLmNlbnRlci5zdHlsZS5sZWZ0PSIwIixlLmxlZnQuc3R5bGUubGVmdD0iMCIsZS5yaWdodC5zdHlsZS5sZWZ0PSIwIn0sbi5wcm90b3R5cGUucmVwYWludD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiRnVuY3Rpb24gcmVwYWludCBpcyBkZXByZWNhdGVkLiBVc2UgcmVkcmF3IGluc3RlYWQuIil9LG4ucHJvdG90eXBlLnNldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmN1cnJlbnRUaW1lKXRocm93IG5ldyBFcnJvcigiT3B0aW9uIHNob3dDdXJyZW50VGltZSBtdXN0IGJlIHRydWUiKTt0aGlzLmN1cnJlbnRUaW1lLnNldEN1cnJlbnRUaW1lKHQpfSxuLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe2lmKCF0aGlzLmN1cnJlbnRUaW1lKXRocm93IG5ldyBFcnJvcigiT3B0aW9uIHNob3dDdXJyZW50VGltZSBtdXN0IGJlIHRydWUiKTtyZXR1cm4gdGhpcy5jdXJyZW50VGltZS5nZXRDdXJyZW50VGltZSgpfSxuLnByb3RvdHlwZS5fdG9UaW1lPWZ1bmN0aW9uKHQpe3JldHVybiBtLnRvVGltZSh0aGlzLHQsdGhpcy5wcm9wcy5jZW50ZXIud2lkdGgpfSxuLnByb3RvdHlwZS5fdG9HbG9iYWxUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiBtLnRvVGltZSh0aGlzLHQsdGhpcy5wcm9wcy5yb290LndpZHRoKX0sbi5wcm90b3R5cGUuX3RvU2NyZWVuPWZ1bmN0aW9uKHQpe3JldHVybiBtLnRvU2NyZWVuKHRoaXMsdCx0aGlzLnByb3BzLmNlbnRlci53aWR0aCl9LG4ucHJvdG90eXBlLl90b0dsb2JhbFNjcmVlbj1mdW5jdGlvbih0KXtyZXR1cm4gbS50b1NjcmVlbih0aGlzLHQsdGhpcy5wcm9wcy5yb290LndpZHRoKX0sbi5wcm90b3R5cGUuX2luaXRBdXRvUmVzaXplPWZ1bmN0aW9uKCl7MT09dGhpcy5vcHRpb25zLmF1dG9SZXNpemU/dGhpcy5fc3RhcnRBdXRvUmVzaXplKCk6dGhpcy5fc3RvcEF1dG9SZXNpemUoKX0sbi5wcm90b3R5cGUuX3N0YXJ0QXV0b1Jlc2l6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fc3RvcEF1dG9SZXNpemUoKSx0aGlzLl9vblJlc2l6ZT1mdW5jdGlvbigpe2lmKDEhPXQub3B0aW9ucy5hdXRvUmVzaXplKXJldHVybiB2b2lkIHQuX3N0b3BBdXRvUmVzaXplKCk7dC5kb20ucm9vdCYmKHQuZG9tLnJvb3Qub2Zmc2V0V2lkdGg9PXQucHJvcHMubGFzdFdpZHRoJiZ0LmRvbS5yb290Lm9mZnNldEhlaWdodD09dC5wcm9wcy5sYXN0SGVpZ2h0fHwodC5wcm9wcy5sYXN0V2lkdGg9dC5kb20ucm9vdC5vZmZzZXRXaWR0aCx0LnByb3BzLmxhc3RIZWlnaHQ9dC5kb20ucm9vdC5vZmZzZXRIZWlnaHQsdC5wcm9wcy5zY3JvbGxiYXJXaWR0aD1jLmdldFNjcm9sbEJhcldpZHRoKCksdC5ib2R5LmVtaXR0ZXIuZW1pdCgiX2NoYW5nZSIpKSl9LGMuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsdGhpcy5fb25SZXNpemUpLHQuZG9tLnJvb3QmJih0LnByb3BzLmxhc3RXaWR0aD10LmRvbS5yb290Lm9mZnNldFdpZHRoLHQucHJvcHMubGFzdEhlaWdodD10LmRvbS5yb290Lm9mZnNldEhlaWdodCksdGhpcy53YXRjaFRpbWVyPXNldEludGVydmFsKHRoaXMuX29uUmVzaXplLDFlMyl9LG4ucHJvdG90eXBlLl9zdG9wQXV0b1Jlc2l6ZT1mdW5jdGlvbigpe3RoaXMud2F0Y2hUaW1lciYmKGNsZWFySW50ZXJ2YWwodGhpcy53YXRjaFRpbWVyKSx0aGlzLndhdGNoVGltZXI9dm9pZCAwKSx0aGlzLl9vblJlc2l6ZSYmKGMucmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsdGhpcy5fb25SZXNpemUpLHRoaXMuX29uUmVzaXplPW51bGwpfSxuLnByb3RvdHlwZS5fb25Ub3VjaD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoLmFsbG93RHJhZ2dpbmc9ITAsdGhpcy50b3VjaC5pbml0aWFsU2Nyb2xsVG9wPXRoaXMucHJvcHMuc2Nyb2xsVG9wfSxuLnByb3RvdHlwZS5fb25QaW5jaD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoLmFsbG93RHJhZ2dpbmc9ITF9LG4ucHJvdG90eXBlLl9vbkRyYWc9ZnVuY3Rpb24odCl7aWYodCYmdGhpcy50b3VjaC5hbGxvd0RyYWdnaW5nKXt2YXIgZT10LmRlbHRhWSxpPXRoaXMuX2dldFNjcm9sbFRvcCgpLG89dGhpcy5fc2V0U2Nyb2xsVG9wKHRoaXMudG91Y2guaW5pdGlhbFNjcm9sbFRvcCtlKTt0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwmJih0aGlzLmRvbS5sZWZ0LnBhcmVudE5vZGUuc2Nyb2xsVG9wPS10aGlzLnByb3BzLnNjcm9sbFRvcCx0aGlzLmRvbS5yaWdodC5wYXJlbnROb2RlLnNjcm9sbFRvcD0tdGhpcy5wcm9wcy5zY3JvbGxUb3ApLG8hPWkmJnRoaXMuZW1pdCgidmVydGljYWxEcmFnIil9fSxuLnByb3RvdHlwZS5fc2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnByb3BzLnNjcm9sbFRvcD10LHRoaXMuX3VwZGF0ZVNjcm9sbFRvcCgpLHRoaXMucHJvcHMuc2Nyb2xsVG9wfSxuLnByb3RvdHlwZS5fdXBkYXRlU2Nyb2xsVG9wPWZ1bmN0aW9uKCl7dmFyIHQ9TWF0aC5taW4odGhpcy5wcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0LXRoaXMucHJvcHMuY2VudGVyLmhlaWdodCwwKTtyZXR1cm4gdCE9dGhpcy5wcm9wcy5zY3JvbGxUb3BNaW4mJigidG9wIiE9dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW0mJih0aGlzLnByb3BzLnNjcm9sbFRvcCs9dC10aGlzLnByb3BzLnNjcm9sbFRvcE1pbiksdGhpcy5wcm9wcy5zY3JvbGxUb3BNaW49dCksdGhpcy5wcm9wcy5zY3JvbGxUb3A+MCYmKHRoaXMucHJvcHMuc2Nyb2xsVG9wPTApLHRoaXMucHJvcHMuc2Nyb2xsVG9wPHQmJih0aGlzLnByb3BzLnNjcm9sbFRvcD10KSx0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwmJih0aGlzLmRvbS5sZWZ0LnBhcmVudE5vZGUuc2Nyb2xsVG9wPS10aGlzLnByb3BzLnNjcm9sbFRvcCx0aGlzLmRvbS5yaWdodC5wYXJlbnROb2RlLnNjcm9sbFRvcD0tdGhpcy5wcm9wcy5zY3JvbGxUb3ApLHRoaXMucHJvcHMuc2Nyb2xsVG9wfSxuLnByb3RvdHlwZS5fZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcHMuc2Nyb2xsVG9wfSxuLnByb3RvdHlwZS5fY3JlYXRlQ29uZmlndXJhdG9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGFic3RyYWN0IG1ldGhvZCBfY3JlYXRlQ29uZmlndXJhdG9yIil9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe3RoaXMuYm9keT10LHRoaXMuZGVmYXVsdE9wdGlvbnM9e3R5cGU6bnVsbCxvcmllbnRhdGlvbjp7aXRlbToiYm90dG9tIn0sYWxpZ246ImF1dG8iLHN0YWNrOiEwLHN0YWNrU3ViZ3JvdXBzOiEwLGdyb3VwT3JkZXJTd2FwOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1lLm9yZGVyO2Uub3JkZXI9dC5vcmRlcix0Lm9yZGVyPW99LGdyb3VwT3JkZXI6Im9yZGVyIixzZWxlY3RhYmxlOiEwLG11bHRpc2VsZWN0OiExLGl0ZW1zQWx3YXlzRHJhZ2dhYmxlOiExLGVkaXRhYmxlOnt1cGRhdGVUaW1lOiExLHVwZGF0ZUdyb3VwOiExLGFkZDohMSxyZW1vdmU6ITEsb3ZlcnJpZGVJdGVtczohMX0sZ3JvdXBFZGl0YWJsZTp7b3JkZXI6ITEsYWRkOiExLHJlbW92ZTohMX0sc25hcDpwLnNuYXAsb25BZGQ6ZnVuY3Rpb24odCxlKXtlKHQpfSxvblVwZGF0ZTpmdW5jdGlvbih0LGUpe2UodCl9LG9uTW92ZTpmdW5jdGlvbih0LGUpe2UodCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sb25Nb3Zpbmc6ZnVuY3Rpb24odCxlKXtlKHQpfSxvbkFkZEdyb3VwOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sb25Nb3ZlR3JvdXA6ZnVuY3Rpb24odCxlKXtlKHQpfSxvblJlbW92ZUdyb3VwOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sbWFyZ2luOntpdGVtOntob3Jpem9udGFsOjEwLHZlcnRpY2FsOjEwfSxheGlzOjIwfSxzaG93VG9vbHRpcHM6ITAsdG9vbHRpcDp7Zm9sbG93TW91c2U6ITEsb3ZlcmZsb3dNZXRob2Q6ImZsaXAifSx0b29sdGlwT25JdGVtVXBkYXRlVGltZTohMX0sdGhpcy5vcHRpb25zPWwuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMub3B0aW9ucy5ydGw9ZS5ydGwsdGhpcy5pdGVtT3B0aW9ucz17dHlwZTp7c3RhcnQ6IkRhdGUiLGVuZDoiRGF0ZSJ9fSx0aGlzLmNvbnZlcnNpb249e3RvU2NyZWVuOnQudXRpbC50b1NjcmVlbix0b1RpbWU6dC51dGlsLnRvVGltZX0sdGhpcy5kb209e30sdGhpcy5wcm9wcz17fSx0aGlzLmhhbW1lcj1udWxsO3ZhciBpPXRoaXM7dGhpcy5pdGVtc0RhdGE9bnVsbCx0aGlzLmdyb3Vwc0RhdGE9bnVsbCx0aGlzLml0ZW1MaXN0ZW5lcnM9e2FkZDpmdW5jdGlvbih0LGUsbyl7aS5fb25BZGQoZS5pdGVtcyl9LHVwZGF0ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25VcGRhdGUoZS5pdGVtcyl9LHJlbW92ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25SZW1vdmUoZS5pdGVtcyl9fSx0aGlzLmdyb3VwTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlLG8pe2kuX29uQWRkR3JvdXBzKGUuaXRlbXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlLG8pe2kuX29uVXBkYXRlR3JvdXBzKGUuaXRlbXMpfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG8pe2kuX29uUmVtb3ZlR3JvdXBzKGUuaXRlbXMpfX0sdGhpcy5pdGVtcz17fSx0aGlzLmdyb3Vwcz17fSx0aGlzLmdyb3VwSWRzPVtdLHRoaXMuc2VsZWN0aW9uPVtdLHRoaXMucG9wdXA9bnVsbCx0aGlzLnRvdWNoUGFyYW1zPXt9LHRoaXMuZ3JvdXBUb3VjaFBhcmFtcz17fSx0aGlzLl9jcmVhdGUoKSx0aGlzLnNldE9wdGlvbnMoZSl9dmFyIHM9aSg1NSkscj1vKHMpLGE9aSg2MiksaD1vKGEpLGQ9aSgxMTIpLGw9aSgxKSx1PWkoODkpLGM9aSg5MykscD1pKDEyNCksZj1pKDEyMCksbT1pKDEyNSksdj1pKDEyOSksZz1pKDEzMCkseT1pKDEzMSksYj1pKDEyNyksXz1pKDEzMiksdz1pKDEzMykuZGVmYXVsdCx4PSJfX3VuZ3JvdXBlZF9fIixrPSJfX2JhY2tncm91bmRfXyI7bi5wcm90b3R5cGU9bmV3IGYsbi50eXBlcz17YmFja2dyb3VuZDpfLGJveDpnLHJhbmdlOmIscG9pbnQ6eX0sbi5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuY2xhc3NOYW1lPSJ2aXMtaXRlbXNldCIsdFsidGltZWxpbmUtaXRlbXNldCJdPXRoaXMsdGhpcy5kb20uZnJhbWU9dDt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTmFtZT0idmlzLWJhY2tncm91bmQiLHQuYXBwZW5kQ2hpbGQoZSksdGhpcy5kb20uYmFja2dyb3VuZD1lO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuY2xhc3NOYW1lPSJ2aXMtZm9yZWdyb3VuZCIsdC5hcHBlbmRDaGlsZChpKSx0aGlzLmRvbS5mb3JlZ3JvdW5kPWk7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7by5jbGFzc05hbWU9InZpcy1heGlzIix0aGlzLmRvbS5heGlzPW87dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bi5jbGFzc05hbWU9InZpcy1sYWJlbHNldCIsdGhpcy5kb20ubGFiZWxTZXQ9bix0aGlzLl91cGRhdGVVbmdyb3VwZWQoKTt2YXIgcz1uZXcgdihrLG51bGwsdGhpcyk7cy5zaG93KCksdGhpcy5ncm91cHNba109cyx0aGlzLmhhbW1lcj1uZXcgZCh0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lciksdGhpcy5oYW1tZXIub24oImhhbW1lci5pbnB1dCIsZnVuY3Rpb24odCl7dC5pc0ZpcnN0JiZ0aGlzLl9vblRvdWNoKHQpfS5iaW5kKHRoaXMpKSx0aGlzLmhhbW1lci5vbigicGFuc3RhcnQiLHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLm9uKCJwYW5tb3ZlIix0aGlzLl9vbkRyYWcuYmluZCh0aGlzKSksdGhpcy5oYW1tZXIub24oInBhbmVuZCIsdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLmdldCgicGFuIikuc2V0KHt0aHJlc2hvbGQ6NSxkaXJlY3Rpb246ZC5ESVJFQ1RJT05fSE9SSVpPTlRBTH0pLHRoaXMuaGFtbWVyLm9uKCJ0YXAiLHRoaXMuX29uU2VsZWN0SXRlbS5iaW5kKHRoaXMpKSx0aGlzLmhhbW1lci5vbigicHJlc3MiLHRoaXMuX29uTXVsdGlTZWxlY3RJdGVtLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLm9uKCJkb3VibGV0YXAiLHRoaXMuX29uQWRkSXRlbS5iaW5kKHRoaXMpKSx0aGlzLm9wdGlvbnMucnRsP3RoaXMuZ3JvdXBIYW1tZXI9bmV3IGQodGhpcy5ib2R5LmRvbS5yaWdodENvbnRhaW5lcik6dGhpcy5ncm91cEhhbW1lcj1uZXcgZCh0aGlzLmJvZHkuZG9tLmxlZnRDb250YWluZXIpLHRoaXMuZ3JvdXBIYW1tZXIub24oInRhcCIsdGhpcy5fb25Hcm91cENsaWNrLmJpbmQodGhpcykpLHRoaXMuZ3JvdXBIYW1tZXIub24oInBhbnN0YXJ0Iix0aGlzLl9vbkdyb3VwRHJhZ1N0YXJ0LmJpbmQodGhpcykpLHRoaXMuZ3JvdXBIYW1tZXIub24oInBhbm1vdmUiLHRoaXMuX29uR3JvdXBEcmFnLmJpbmQodGhpcykpLHRoaXMuZ3JvdXBIYW1tZXIub24oInBhbmVuZCIsdGhpcy5fb25Hcm91cERyYWdFbmQuYmluZCh0aGlzKSksdGhpcy5ncm91cEhhbW1lci5nZXQoInBhbiIpLnNldCh7dGhyZXNob2xkOjUsZGlyZWN0aW9uOmQuRElSRUNUSU9OX1ZFUlRJQ0FMfSksdGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLl9vbk1vdXNlT3Zlci5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5fb25Nb3VzZU91dC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMuX29uTW91c2VNb3ZlLmJpbmQodGhpcykpLHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLl9vbkRyYWdFbmQuYmluZCh0aGlzKSksdGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsdGhpcy5fb25Nb3VzZVdoZWVsLmJpbmQodGhpcykpLHRoaXMuc2hvdygpfSxuLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPVsidHlwZSIsInJ0bCIsImFsaWduIiwib3JkZXIiLCJzdGFjayIsInN0YWNrU3ViZ3JvdXBzIiwic2VsZWN0YWJsZSIsIm11bHRpc2VsZWN0IiwiaXRlbXNBbHdheXNEcmFnZ2FibGUiLCJtdWx0aXNlbGVjdFBlckdyb3VwIiwiZ3JvdXBPcmRlciIsImRhdGFBdHRyaWJ1dGVzIiwidGVtcGxhdGUiLCJncm91cFRlbXBsYXRlIiwidmlzaWJsZUZyYW1lVGVtcGxhdGUiLCJoaWRlIiwic25hcCIsImdyb3VwT3JkZXJTd2FwIiwic2hvd1Rvb2x0aXBzIiwidG9vbHRpcCIsInRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lIl07bC5zZWxlY3RpdmVFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCksIm9yaWVudGF0aW9uImluIHQmJigic3RyaW5nIj09dHlwZW9mIHQub3JpZW50YXRpb24/dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW09InRvcCI9PT10Lm9yaWVudGF0aW9uPyJ0b3AiOiJib3R0b20iOiJvYmplY3QiPT09KDAsaC5kZWZhdWx0KSh0Lm9yaWVudGF0aW9uKSYmIml0ZW0iaW4gdC5vcmllbnRhdGlvbiYmKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtPXQub3JpZW50YXRpb24uaXRlbSkpLCJtYXJnaW4iaW4gdCYmKCJudW1iZXIiPT10eXBlb2YgdC5tYXJnaW4/KHRoaXMub3B0aW9ucy5tYXJnaW4uYXhpcz10Lm1hcmdpbix0aGlzLm9wdGlvbnMubWFyZ2luLml0ZW0uaG9yaXpvbnRhbD10Lm1hcmdpbix0aGlzLm9wdGlvbnMubWFyZ2luLml0ZW0udmVydGljYWw9dC5tYXJnaW4pOiJvYmplY3QiPT09KDAsaC5kZWZhdWx0KSh0Lm1hcmdpbikmJihsLnNlbGVjdGl2ZUV4dGVuZChbImF4aXMiXSx0aGlzLm9wdGlvbnMubWFyZ2luLHQubWFyZ2luKSwiaXRlbSJpbiB0Lm1hcmdpbiYmKCJudW1iZXIiPT10eXBlb2YgdC5tYXJnaW4uaXRlbT8odGhpcy5vcHRpb25zLm1hcmdpbi5pdGVtLmhvcml6b250YWw9dC5tYXJnaW4uaXRlbSx0aGlzLm9wdGlvbnMubWFyZ2luLml0ZW0udmVydGljYWw9dC5tYXJnaW4uaXRlbSk6Im9iamVjdCI9PT0oMCxoLmRlZmF1bHQpKHQubWFyZ2luLml0ZW0pJiZsLnNlbGVjdGl2ZUV4dGVuZChbImhvcml6b250YWwiLCJ2ZXJ0aWNhbCJdLHRoaXMub3B0aW9ucy5tYXJnaW4uaXRlbSx0Lm1hcmdpbi5pdGVtKSkpKSwiZWRpdGFibGUiaW4gdCYmKCJib29sZWFuIj09dHlwZW9mIHQuZWRpdGFibGU/KHRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lPXQuZWRpdGFibGUsdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZUdyb3VwPXQuZWRpdGFibGUsdGhpcy5vcHRpb25zLmVkaXRhYmxlLmFkZD10LmVkaXRhYmxlLHRoaXMub3B0aW9ucy5lZGl0YWJsZS5yZW1vdmU9dC5lZGl0YWJsZSx0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcz0hMSk6Im9iamVjdCI9PT0oMCxoLmRlZmF1bHQpKHQuZWRpdGFibGUpJiZsLnNlbGVjdGl2ZUV4dGVuZChbInVwZGF0ZVRpbWUiLCJ1cGRhdGVHcm91cCIsImFkZCIsInJlbW92ZSIsIm92ZXJyaWRlSXRlbXMiXSx0aGlzLm9wdGlvbnMuZWRpdGFibGUsdC5lZGl0YWJsZSkpLCJncm91cEVkaXRhYmxlImluIHQmJigiYm9vbGVhbiI9PXR5cGVvZiB0Lmdyb3VwRWRpdGFibGU/KHRoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLm9yZGVyPXQuZ3JvdXBFZGl0YWJsZSx0aGlzLm9wdGlvbnMuZ3JvdXBFZGl0YWJsZS5hZGQ9dC5ncm91cEVkaXRhYmxlLHRoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLnJlbW92ZT10Lmdyb3VwRWRpdGFibGUpOiJvYmplY3QiPT09KDAsaC5kZWZhdWx0KSh0Lmdyb3VwRWRpdGFibGUpJiZsLnNlbGVjdGl2ZUV4dGVuZChbIm9yZGVyIiwiYWRkIiwicmVtb3ZlIl0sdGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUsdC5ncm91cEVkaXRhYmxlKSkKO1sib25BZGQiLCJvblVwZGF0ZSIsIm9uUmVtb3ZlIiwib25Nb3ZlIiwib25Nb3ZpbmciLCJvbkFkZEdyb3VwIiwib25Nb3ZlR3JvdXAiLCJvblJlbW92ZUdyb3VwIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgaT10W2VdO2lmKGkpe2lmKCEoaSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbiAiK2UrIiBtdXN0IGJlIGEgZnVuY3Rpb24gIitlKyIoaXRlbSwgY2FsbGJhY2spIik7dGhpcy5vcHRpb25zW2VdPWl9fS5iaW5kKHRoaXMpKSx0aGlzLm1hcmtEaXJ0eSgpfX0sbi5wcm90b3R5cGUubWFya0RpcnR5PWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXBJZHM9W10sdCYmdC5yZWZyZXNoSXRlbXMmJmwuZm9yRWFjaCh0aGlzLml0ZW1zLGZ1bmN0aW9uKHQpe3QuZGlydHk9ITAsdC5kaXNwbGF5ZWQmJnQucmVkcmF3KCl9KX0sbi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuaGlkZSgpLHRoaXMuc2V0SXRlbXMobnVsbCksdGhpcy5zZXRHcm91cHMobnVsbCksdGhpcy5oYW1tZXI9bnVsbCx0aGlzLmJvZHk9bnVsbCx0aGlzLmNvbnZlcnNpb249bnVsbH0sbi5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLmF4aXMucGFyZW50Tm9kZSYmdGhpcy5kb20uYXhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmF4aXMpLHRoaXMuZG9tLmxhYmVsU2V0LnBhcmVudE5vZGUmJnRoaXMuZG9tLmxhYmVsU2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ubGFiZWxTZXQpfSxuLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5jZW50ZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLmF4aXMucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuYXBwZW5kQ2hpbGQodGhpcy5kb20uYXhpcyksdGhpcy5kb20ubGFiZWxTZXQucGFyZW50Tm9kZXx8KHRoaXMub3B0aW9ucy5ydGw/dGhpcy5ib2R5LmRvbS5yaWdodC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sYWJlbFNldCk6dGhpcy5ib2R5LmRvbS5sZWZ0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmxhYmVsU2V0KSl9LG4ucHJvdG90eXBlLnNldFNlbGVjdGlvbj1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbjtmb3Iodm9pZCAwPT10JiYodD1bXSksQXJyYXkuaXNBcnJheSh0KXx8KHQ9W3RdKSxlPTAsaT10aGlzLnNlbGVjdGlvbi5sZW5ndGg7ZTxpO2UrKylvPXRoaXMuc2VsZWN0aW9uW2VdLChuPXRoaXMuaXRlbXNbb10pJiZuLnVuc2VsZWN0KCk7Zm9yKHRoaXMuc2VsZWN0aW9uPVtdLGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspbz10W2VdLChuPXRoaXMuaXRlbXNbb10pJiYodGhpcy5zZWxlY3Rpb24ucHVzaChvKSxuLnNlbGVjdCgpKX0sbi5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmNvbmNhdChbXSl9LG4ucHJvdG90eXBlLmdldFZpc2libGVJdGVtcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS5yYW5nZS5nZXRSYW5nZSgpO2lmKHRoaXMub3B0aW9ucy5ydGwpdmFyIGU9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4odC5zdGFydCksaT10aGlzLmJvZHkudXRpbC50b1NjcmVlbih0LmVuZCk7ZWxzZSB2YXIgaT10aGlzLmJvZHkudXRpbC50b1NjcmVlbih0LnN0YXJ0KSxlPXRoaXMuYm9keS51dGlsLnRvU2NyZWVuKHQuZW5kKTt2YXIgbz1bXTtmb3IodmFyIG4gaW4gdGhpcy5ncm91cHMpaWYodGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkobikpZm9yKHZhciBzPXRoaXMuZ3JvdXBzW25dLHI9cy5pc1Zpc2libGU/cy52aXNpYmxlSXRlbXM6W10sYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaD1yW2FdO3RoaXMub3B0aW9ucy5ydGw/aC5yaWdodDxpJiZoLnJpZ2h0K2gud2lkdGg+ZSYmby5wdXNoKGguaWQpOmgubGVmdDxlJiZoLmxlZnQraC53aWR0aD5pJiZvLnB1c2goaC5pZCl9cmV0dXJuIG99LG4ucHJvdG90eXBlLl9kZXNlbGVjdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5zZWxlY3Rpb24saT0wLG89ZS5sZW5ndGg7aTxvO2krKylpZihlW2ldPT10KXtlLnNwbGljZShpLDEpO2JyZWFrfX0sbi5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLm1hcmdpbixlPXRoaXMuYm9keS5yYW5nZSxpPWwub3B0aW9uLmFzU2l6ZSxvPXRoaXMub3B0aW9ucyxuPW8ub3JpZW50YXRpb24uaXRlbSxzPSExLHI9dGhpcy5kb20uZnJhbWU7dGhpcy5wcm9wcy50b3A9dGhpcy5ib2R5LmRvbVByb3BzLnRvcC5oZWlnaHQrdGhpcy5ib2R5LmRvbVByb3BzLmJvcmRlci50b3AsdGhpcy5vcHRpb25zLnJ0bD90aGlzLnByb3BzLnJpZ2h0PXRoaXMuYm9keS5kb21Qcm9wcy5yaWdodC53aWR0aCt0aGlzLmJvZHkuZG9tUHJvcHMuYm9yZGVyLnJpZ2h0OnRoaXMucHJvcHMubGVmdD10aGlzLmJvZHkuZG9tUHJvcHMubGVmdC53aWR0aCt0aGlzLmJvZHkuZG9tUHJvcHMuYm9yZGVyLmxlZnQsci5jbGFzc05hbWU9InZpcy1pdGVtc2V0IixzPXRoaXMuX29yZGVyR3JvdXBzKCl8fHM7dmFyIGE9ZS5lbmQtZS5zdGFydCxoPWEhPXRoaXMubGFzdFZpc2libGVJbnRlcnZhbHx8dGhpcy5wcm9wcy53aWR0aCE9dGhpcy5wcm9wcy5sYXN0V2lkdGgsZD1lLnN0YXJ0IT10aGlzLmxhc3RSYW5nZVN0YXJ0LHU9aHx8ZDt0aGlzLmxhc3RWaXNpYmxlSW50ZXJ2YWw9YSx0aGlzLmxhc3RSYW5nZVN0YXJ0PWUuc3RhcnQsdGhpcy5wcm9wcy5sYXN0V2lkdGg9dGhpcy5wcm9wcy53aWR0aDt2YXIgYz10aGlzLl9maXJzdEdyb3VwKCkscD17aXRlbTp0Lml0ZW0sYXhpczp0LmF4aXN9LGY9e2l0ZW06dC5pdGVtLGF4aXM6dC5pdGVtLnZlcnRpY2FsLzJ9LG09MCx2PXQuYXhpcyt0Lml0ZW0udmVydGljYWw7cmV0dXJuIHRoaXMuZ3JvdXBzW2tdLnJlZHJhdyhlLGYsdSksbC5mb3JFYWNoKHRoaXMuZ3JvdXBzLGZ1bmN0aW9uKHQpe3ZhciBpPXQ9PWM/cDpmLG89dC5yZWRyYXcoZSxpLHUpO3M9b3x8cyxtKz10LmhlaWdodH0pLG09TWF0aC5tYXgobSx2KSxyLnN0eWxlLmhlaWdodD1pKG0pLHRoaXMucHJvcHMud2lkdGg9ci5vZmZzZXRXaWR0aCx0aGlzLnByb3BzLmhlaWdodD1tLHRoaXMuZG9tLmF4aXMuc3R5bGUudG9wPWkoInRvcCI9PW4/dGhpcy5ib2R5LmRvbVByb3BzLnRvcC5oZWlnaHQrdGhpcy5ib2R5LmRvbVByb3BzLmJvcmRlci50b3A6dGhpcy5ib2R5LmRvbVByb3BzLnRvcC5oZWlnaHQrdGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQpLHRoaXMub3B0aW9ucy5ydGw/dGhpcy5kb20uYXhpcy5zdHlsZS5yaWdodD0iMCI6dGhpcy5kb20uYXhpcy5zdHlsZS5sZWZ0PSIwIix0aGlzLmluaXRpYWxJdGVtU2V0RHJhd249ITAscz10aGlzLl9pc1Jlc2l6ZWQoKXx8c30sbi5wcm90b3R5cGUuX2ZpcnN0R3JvdXA9ZnVuY3Rpb24oKXt2YXIgdD0idG9wIj09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW0/MDp0aGlzLmdyb3VwSWRzLmxlbmd0aC0xLGU9dGhpcy5ncm91cElkc1t0XTtyZXR1cm4gdGhpcy5ncm91cHNbZV18fHRoaXMuZ3JvdXBzW3hdfHxudWxsfSxuLnByb3RvdHlwZS5fdXBkYXRlVW5ncm91cGVkPWZ1bmN0aW9uKCl7dmFyIHQsZSxpPXRoaXMuZ3JvdXBzW3hdO3RoaXMuZ3JvdXBzW2tdO2lmKHRoaXMuZ3JvdXBzRGF0YSl7aWYoaSl7aS5oaWRlKCksZGVsZXRlIHRoaXMuZ3JvdXBzW3hdO2ZvcihlIGluIHRoaXMuaXRlbXMpaWYodGhpcy5pdGVtcy5oYXNPd25Qcm9wZXJ0eShlKSl7dD10aGlzLml0ZW1zW2VdLHQucGFyZW50JiZ0LnBhcmVudC5yZW1vdmUodCk7dmFyIG89dGhpcy5fZ2V0R3JvdXBJZCh0LmRhdGEpLG49dGhpcy5ncm91cHNbb107biYmbi5hZGQodCl8fHQuaGlkZSgpfX19ZWxzZSBpZighaSl7aT1uZXcgbShudWxsLG51bGwsdGhpcyksdGhpcy5ncm91cHNbeF09aTtmb3IoZSBpbiB0aGlzLml0ZW1zKXRoaXMuaXRlbXMuaGFzT3duUHJvcGVydHkoZSkmJih0PXRoaXMuaXRlbXNbZV0saS5hZGQodCkpO2kuc2hvdygpfX0sbi5wcm90b3R5cGUuZ2V0TGFiZWxTZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb20ubGFiZWxTZXR9LG4ucHJvdG90eXBlLnNldEl0ZW1zPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcyxvPXRoaXMuaXRlbXNEYXRhO2lmKHQpe2lmKCEodCBpbnN0YW5jZW9mIHV8fHQgaW5zdGFuY2VvZiBjKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJEYXRhIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRGF0YVNldCBvciBEYXRhVmlldyIpO3RoaXMuaXRlbXNEYXRhPXR9ZWxzZSB0aGlzLml0ZW1zRGF0YT1udWxsO2lmKG8mJihsLmZvckVhY2godGhpcy5pdGVtTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7by5vZmYoZSx0KX0pLGU9by5nZXRJZHMoKSx0aGlzLl9vblJlbW92ZShlKSksdGhpcy5pdGVtc0RhdGEpe3ZhciBuPXRoaXMuaWQ7bC5mb3JFYWNoKHRoaXMuaXRlbUxpc3RlbmVycyxmdW5jdGlvbih0LGUpe2kuaXRlbXNEYXRhLm9uKGUsdCxuKX0pLGU9dGhpcy5pdGVtc0RhdGEuZ2V0SWRzKCksdGhpcy5fb25BZGQoZSksdGhpcy5fdXBkYXRlVW5ncm91cGVkKCl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2NoYW5nZSIse3F1ZXVlOiEwfSl9LG4ucHJvdG90eXBlLmdldEl0ZW1zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlbXNEYXRhfSxuLnByb3RvdHlwZS5zZXRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzO2lmKHRoaXMuZ3JvdXBzRGF0YSYmKGwuZm9yRWFjaCh0aGlzLmdyb3VwTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7aS5ncm91cHNEYXRhLm9mZihlLHQpfSksZT10aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKCksdGhpcy5ncm91cHNEYXRhPW51bGwsdGhpcy5fb25SZW1vdmVHcm91cHMoZSkpLHQpe2lmKCEodCBpbnN0YW5jZW9mIHV8fHQgaW5zdGFuY2VvZiBjKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJEYXRhIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRGF0YVNldCBvciBEYXRhVmlldyIpO3RoaXMuZ3JvdXBzRGF0YT10fWVsc2UgdGhpcy5ncm91cHNEYXRhPW51bGw7aWYodGhpcy5ncm91cHNEYXRhKXt2YXIgbz10aGlzLmdyb3Vwc0RhdGE7dGhpcy5ncm91cHNEYXRhIGluc3RhbmNlb2YgYyYmKG89dGhpcy5ncm91cHNEYXRhLmdldERhdGFTZXQoKSksby5nZXQoKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QubmVzdGVkR3JvdXBzJiZ0Lm5lc3RlZEdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBpPW8uZ2V0KGUpO2kubmVzdGVkSW5Hcm91cD10LmlkLDA9PXQuc2hvd05lc3RlZCYmKGkudmlzaWJsZT0hMSksby51cGRhdGUoaSl9KX0pO3ZhciBuPXRoaXMuaWQ7bC5mb3JFYWNoKHRoaXMuZ3JvdXBMaXN0ZW5lcnMsZnVuY3Rpb24odCxlKXtpLmdyb3Vwc0RhdGEub24oZSx0LG4pfSksZT10aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKCksdGhpcy5fb25BZGRHcm91cHMoZSl9dGhpcy5fdXBkYXRlVW5ncm91cGVkKCksdGhpcy5fb3JkZXIoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfY2hhbmdlIix7cXVldWU6ITB9KX0sbi5wcm90b3R5cGUuZ2V0R3JvdXBzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3JvdXBzRGF0YX0sbi5wcm90b3R5cGUucmVtb3ZlSXRlbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLml0ZW1zRGF0YS5nZXQodCksaT10aGlzLml0ZW1zRGF0YS5nZXREYXRhU2V0KCk7dGhpcy5pdGVtc1t0XTtlJiZ0aGlzLm9wdGlvbnMub25SZW1vdmUoZSxmdW5jdGlvbihlKXtlJiZpLnJlbW92ZSh0KX0pfSxuLnByb3RvdHlwZS5fZ2V0VHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfHx0aGlzLm9wdGlvbnMudHlwZXx8KHQuZW5kPyJyYW5nZSI6ImJveCIpfSxuLnByb3RvdHlwZS5fZ2V0R3JvdXBJZD1mdW5jdGlvbih0KXtyZXR1cm4iYmFja2dyb3VuZCI9PXRoaXMuX2dldFR5cGUodCkmJnZvaWQgMD09dC5ncm91cD9rOnRoaXMuZ3JvdXBzRGF0YT90Lmdyb3VwOnh9LG4ucHJvdG90eXBlLl9vblVwZGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3QuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgaSxvPWUuaXRlbXNEYXRhLmdldCh0LGUuaXRlbU9wdGlvbnMpLHM9ZS5pdGVtc1t0XSxyPW8/ZS5fZ2V0VHlwZShvKTpudWxsLGE9bi50eXBlc1tyXTtpZihzJiYoYSYmcyBpbnN0YW5jZW9mIGE/ZS5fdXBkYXRlSXRlbShzLG8pOihpPXMuc2VsZWN0ZWQsZS5fcmVtb3ZlSXRlbShzKSxzPW51bGwpKSwhcyYmbyl7aWYoIWEpdGhyb3cicmFuZ2VvdmVyZmxvdyI9PXI/bmV3IFR5cGVFcnJvcignSXRlbSB0eXBlICJyYW5nZW92ZXJmbG93IiBpcyBkZXByZWNhdGVkLiBVc2UgY3NzIHN0eWxpbmcgaW5zdGVhZDogLnZpcy1pdGVtLnZpcy1yYW5nZSAudmlzLWl0ZW0tY29udGVudCB7b3ZlcmZsb3c6IHZpc2libGU7fScpOm5ldyBUeXBlRXJyb3IoJ1Vua25vd24gaXRlbSB0eXBlICInK3IrJyInKTtzPW5ldyBhKG8sZS5jb252ZXJzaW9uLGUub3B0aW9ucykscy5pZD10LGUuX2FkZEl0ZW0ocyksaSYmKHRoaXMuc2VsZWN0aW9uLnB1c2godCkscy5zZWxlY3QoKSl9fS5iaW5kKHRoaXMpKSx0aGlzLl9vcmRlcigpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiLHtxdWV1ZTohMH0pfSxuLnByb3RvdHlwZS5fb25BZGQ9bi5wcm90b3R5cGUuX29uVXBkYXRlLG4ucHJvdG90eXBlLl9vblJlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT0wLGk9dGhpczt0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG89aS5pdGVtc1t0XTtvJiYoZSsrLGkuX3JlbW92ZUl0ZW0obykpfSksZSYmKHRoaXMuX29yZGVyKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2NoYW5nZSIse3F1ZXVlOiEwfSkpfSxuLnByb3RvdHlwZS5fb3JkZXI9ZnVuY3Rpb24oKXtsLmZvckVhY2godGhpcy5ncm91cHMsZnVuY3Rpb24odCl7dC5vcmRlcigpfSl9LG4ucHJvdG90eXBlLl9vblVwZGF0ZUdyb3Vwcz1mdW5jdGlvbih0KXt0aGlzLl9vbkFkZEdyb3Vwcyh0KX0sbi5wcm90b3R5cGUuX29uQWRkR3JvdXBzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBpPWUuZ3JvdXBzRGF0YS5nZXQodCksbz1lLmdyb3Vwc1t0XTtpZihvKW8uc2V0RGF0YShpKTtlbHNle2lmKHQ9PXh8fHQ9PWspdGhyb3cgbmV3IEVycm9yKCJJbGxlZ2FsIGdyb3VwIGlkLiAiK3QrIiBpcyBhIHJlc2VydmVkIGlkLiIpO3ZhciBuPSgwLHIuZGVmYXVsdCkoZS5vcHRpb25zKTtsLmV4dGVuZChuLHtoZWlnaHQ6bnVsbH0pLG89bmV3IG0odCxpLGUpLGUuZ3JvdXBzW3RdPW87Zm9yKHZhciBzIGluIGUuaXRlbXMpaWYoZS5pdGVtcy5oYXNPd25Qcm9wZXJ0eShzKSl7dmFyIGE9ZS5pdGVtc1tzXTthLmRhdGEuZ3JvdXA9PXQmJm8uYWRkKGEpfW8ub3JkZXIoKSxvLnNob3coKX19KSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfY2hhbmdlIix7cXVldWU6ITB9KX0sbi5wcm90b3R5cGUuX29uUmVtb3ZlR3JvdXBzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JvdXBzO3QuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgaT1lW3RdO2kmJihpLmhpZGUoKSxkZWxldGUgZVt0XSl9KSx0aGlzLm1hcmtEaXJ0eSgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiLHtxdWV1ZTohMH0pfSxuLnByb3RvdHlwZS5fb3JkZXJHcm91cHM9ZnVuY3Rpb24oKXtpZih0aGlzLmdyb3Vwc0RhdGEpe3ZhciB0PXRoaXMuZ3JvdXBzRGF0YS5nZXRJZHMoe29yZGVyOnRoaXMub3B0aW9ucy5ncm91cE9yZGVyfSk7dD10aGlzLl9vcmRlck5lc3RlZEdyb3Vwcyh0KTt2YXIgZT0hbC5lcXVhbEFycmF5KHQsdGhpcy5ncm91cElkcyk7aWYoZSl7dmFyIGk9dGhpcy5ncm91cHM7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lbdF0uaGlkZSgpfSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lbdF0uc2hvdygpfSksdGhpcy5ncm91cElkcz10fXJldHVybiBlfXJldHVybiExfSxuLnByb3RvdHlwZS5fb3JkZXJOZXN0ZWRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgaT10aGlzLmdyb3Vwc0RhdGEuZ2V0KHQpO2lmKGkubmVzdGVkSW5Hcm91cHx8ZS5wdXNoKHQpLGkubmVzdGVkR3JvdXBzKXt2YXIgbz10aGlzLmdyb3Vwc0RhdGEuZ2V0KHtmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmVzdGVkSW5Hcm91cD09dH0sb3JkZXI6dGhpcy5vcHRpb25zLmdyb3VwT3JkZXJ9KSxuPW8ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LmlkfSk7ZT1lLmNvbmNhdChuKX19LHRoaXMpLGV9LG4ucHJvdG90eXBlLl9hZGRJdGVtPWZ1bmN0aW9uKHQpe3RoaXMuaXRlbXNbdC5pZF09dDt2YXIgZT10aGlzLl9nZXRHcm91cElkKHQuZGF0YSksaT10aGlzLmdyb3Vwc1tlXTtpP2kmJmkuZGF0YSYmaS5kYXRhLnNob3dOZXN0ZWQmJih0Lmdyb3VwU2hvd2luZz0hMCk6dC5ncm91cFNob3dpbmc9ITEsaSYmaS5hZGQodCl9LG4ucHJvdG90eXBlLl91cGRhdGVJdGVtPWZ1bmN0aW9uKHQsZSl7dC5zZXREYXRhKGUpO3ZhciBpPXRoaXMuX2dldEdyb3VwSWQodC5kYXRhKSxvPXRoaXMuZ3JvdXBzW2ldO28/byYmby5kYXRhJiZvLmRhdGEuc2hvd05lc3RlZCYmKHQuZ3JvdXBTaG93aW5nPSEwKTp0Lmdyb3VwU2hvd2luZz0hMX0sbi5wcm90b3R5cGUuX3JlbW92ZUl0ZW09ZnVuY3Rpb24odCl7dC5oaWRlKCksZGVsZXRlIHRoaXMuaXRlbXNbdC5pZF07dmFyIGU9dGhpcy5zZWxlY3Rpb24uaW5kZXhPZih0LmlkKTstMSE9ZSYmdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGUsMSksdC5wYXJlbnQmJnQucGFyZW50LnJlbW92ZSh0KX0sbi5wcm90b3R5cGUuX2NvbnN0cnVjdEJ5RW5kQXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9MDtpPHQubGVuZ3RoO2krKyl0W2ldaW5zdGFuY2VvZiBiJiZlLnB1c2godFtpXSk7cmV0dXJuIGV9LG4ucHJvdG90eXBlLl9vblRvdWNoPWZ1bmN0aW9uKHQpe3RoaXMudG91Y2hQYXJhbXMuaXRlbT10aGlzLml0ZW1Gcm9tVGFyZ2V0KHQpLHRoaXMudG91Y2hQYXJhbXMuZHJhZ0xlZnRJdGVtPXQudGFyZ2V0LmRyYWdMZWZ0SXRlbXx8ITEsdGhpcy50b3VjaFBhcmFtcy5kcmFnUmlnaHRJdGVtPXQudGFyZ2V0LmRyYWdSaWdodEl0ZW18fCExLHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzPW51bGx9LG4ucHJvdG90eXBlLl9nZXRHcm91cEluZGV4PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5ncm91cElkcy5sZW5ndGg7ZSsrKWlmKHQ9PXRoaXMuZ3JvdXBJZHNbZV0pcmV0dXJuIGV9LG4ucHJvdG90eXBlLl9vbkRyYWdTdGFydD1mdW5jdGlvbih0KXtpZighdGhpcy50b3VjaFBhcmFtcy5pdGVtSXNEcmFnZ2luZyl7dmFyIGUsaT10aGlzLnRvdWNoUGFyYW1zLml0ZW18fG51bGwsbz10aGlzO2lmKGkmJihpLnNlbGVjdGVkfHx0aGlzLm9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGUpKXtpZih0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcyYmIXRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lJiYhdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZUdyb3VwKXJldHVybjtpZihudWxsIT1pLmVkaXRhYmxlJiYhaS5lZGl0YWJsZS51cGRhdGVUaW1lJiYhaS5lZGl0YWJsZS51cGRhdGVHcm91cCYmIXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zKXJldHVybjt2YXIgbj10aGlzLnRvdWNoUGFyYW1zLmRyYWdMZWZ0SXRlbSxzPXRoaXMudG91Y2hQYXJhbXMuZHJhZ1JpZ2h0SXRlbTtpZih0aGlzLnRvdWNoUGFyYW1zLml0ZW1Jc0RyYWdnaW5nPSEwLHRoaXMudG91Y2hQYXJhbXMuc2VsZWN0ZWRJdGVtPWksbillPXtpdGVtOm4saW5pdGlhbFg6dC5jZW50ZXIueCxkcmFnTGVmdDohMCxkYXRhOnRoaXMuX2Nsb25lSXRlbURhdGEoaS5kYXRhKX0sdGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHM9W2VdO2Vsc2UgaWYocyllPXtpdGVtOnMsaW5pdGlhbFg6dC5jZW50ZXIueCxkcmFnUmlnaHQ6ITAsZGF0YTp0aGlzLl9jbG9uZUl0ZW1EYXRhKGkuZGF0YSl9LHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzPVtlXTtlbHNle3ZhciByPXRoaXMuX2dldEdyb3VwSW5kZXgoaS5kYXRhLmdyb3VwKSxhPXRoaXMub3B0aW9ucy5pdGVtc0Fsd2F5c0RyYWdnYWJsZSYmIWkuc2VsZWN0ZWQ/W2kuaWRdOnRoaXMuZ2V0U2VsZWN0aW9uKCk7dGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHM9YS5tYXAoZnVuY3Rpb24oZSl7dmFyIGk9by5pdGVtc1tlXSxuPW8uX2dldEdyb3VwSW5kZXgoaS5kYXRhLmdyb3VwKTtyZXR1cm57aXRlbTppLGluaXRpYWxYOnQuY2VudGVyLngsZ3JvdXBPZmZzZXQ6ci1uLGRhdGE6dGhpcy5fY2xvbmVJdGVtRGF0YShpLmRhdGEpfX0uYmluZCh0aGlzKSl9dC5zdG9wUHJvcGFnYXRpb24oKX1lbHNlIHRoaXMub3B0aW9ucy5lZGl0YWJsZS5hZGQmJih0LnNyY0V2ZW50LmN0cmxLZXl8fHQuc3JjRXZlbnQubWV0YUtleSkmJnRoaXMuX29uRHJhZ1N0YXJ0QWRkSXRlbSh0KX19LG4ucHJvdG90eXBlLl9vbkRyYWdTdGFydEFkZEl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLnNuYXB8fG51bGw7aWYodGhpcy5vcHRpb25zLnJ0bCl2YXIgaT1sLmdldEFic29sdXRlUmlnaHQodGhpcy5kb20uZnJhbWUpLG89aS10LmNlbnRlci54KzEwO2Vsc2UgdmFyIGk9bC5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uZnJhbWUpLG89dC5jZW50ZXIueC1pLTEwO3ZhciBuPXRoaXMuYm9keS51dGlsLnRvVGltZShvKSxzPXRoaXMuYm9keS51dGlsLmdldFNjYWxlKCkscj10aGlzLmJvZHkudXRpbC5nZXRTdGVwKCksYT1lP2UobixzLHIpOm4saD1hLGQ9e3R5cGU6InJhbmdlIixzdGFydDphLGVuZDpoLGNvbnRlbnQ6Im5ldyBpdGVtIn0sdT1sLnJhbmRvbVVVSUQoKTtkW3RoaXMuaXRlbXNEYXRhLl9maWVsZElkXT11O3ZhciBjPXRoaXMuZ3JvdXBGcm9tVGFyZ2V0KHQpO2MmJihkLmdyb3VwPWMuZ3JvdXBJZCk7dmFyIHA9bmV3IGIoZCx0aGlzLmNvbnZlcnNpb24sdGhpcy5vcHRpb25zKTtwLmlkPXUscC5kYXRhPXRoaXMuX2Nsb25lSXRlbURhdGEoZCksdGhpcy5fYWRkSXRlbShwKSx0aGlzLnRvdWNoUGFyYW1zLnNlbGVjdGVkSXRlbT1wO3ZhciBmPXtpdGVtOnAsaW5pdGlhbFg6dC5jZW50ZXIueCxkYXRhOnAuZGF0YX07dGhpcy5vcHRpb25zLnJ0bD9mLmRyYWdMZWZ0PSEwOmYuZHJhZ1JpZ2h0PSEwLHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzPVtmXSx0LnN0b3BQcm9wYWdhdGlvbigpfSxuLnByb3RvdHlwZS5fb25EcmFnPWZ1bmN0aW9uKHQpe2lmKHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzKXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBlPXRoaXMsaT10aGlzLm9wdGlvbnMuc25hcHx8bnVsbDtpZih0aGlzLm9wdGlvbnMucnRsKXZhciBvPXRoaXMuYm9keS5kb20ucm9vdC5vZmZzZXRMZWZ0K3RoaXMuYm9keS5kb21Qcm9wcy5yaWdodC53aWR0aDtlbHNlIHZhciBvPXRoaXMuYm9keS5kb20ucm9vdC5vZmZzZXRMZWZ0K3RoaXMuYm9keS5kb21Qcm9wcy5sZWZ0LndpZHRoO3ZhciBuPXRoaXMuYm9keS51dGlsLmdldFNjYWxlKCkscz10aGlzLmJvZHkudXRpbC5nZXRTdGVwKCkscj10aGlzLnRvdWNoUGFyYW1zLnNlbGVjdGVkSXRlbSxhPSh0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtc3x8bnVsbD09ci5lZGl0YWJsZSkmJnRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVHcm91cHx8IXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zJiZudWxsIT1yLmVkaXRhYmxlJiZyLmVkaXRhYmxlLnVwZGF0ZUdyb3VwLGg9bnVsbDtpZihhJiZyJiZ2b2lkIDAhPXIuZGF0YS5ncm91cCl7dmFyIGQ9ZS5ncm91cEZyb21UYXJnZXQodCk7ZCYmKGg9dGhpcy5fZ2V0R3JvdXBJbmRleChkLmdyb3VwSWQpKX10aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciB1PWUuYm9keS51dGlsLnRvVGltZSh0LmNlbnRlci54LW8pLGM9ZS5ib2R5LnV0aWwudG9UaW1lKGQuaW5pdGlhbFgtbyk7aWYodGhpcy5vcHRpb25zLnJ0bCl2YXIgcD0tKHUtYyk7ZWxzZSB2YXIgcD11LWM7dmFyIGY9dGhpcy5fY2xvbmVJdGVtRGF0YShkLml0ZW0uZGF0YSk7aWYobnVsbD09ZC5pdGVtLmVkaXRhYmxlfHxkLml0ZW0uZWRpdGFibGUudXBkYXRlVGltZXx8ZC5pdGVtLmVkaXRhYmxlLnVwZGF0ZUdyb3VwfHxlLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcyl7aWYoKHRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zfHxudWxsPT1yLmVkaXRhYmxlKSYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWV8fCF0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcyYmbnVsbCE9ci5lZGl0YWJsZSYmci5lZGl0YWJsZS51cGRhdGVUaW1lKWlmKGQuZHJhZ0xlZnQpe2lmKHRoaXMub3B0aW9ucy5ydGwpe2lmKHZvaWQgMCE9Zi5lbmQpe3ZhciBtPWwuY29udmVydChkLmRhdGEuZW5kLCJEYXRlIiksdj1uZXcgRGF0ZShtLnZhbHVlT2YoKStwKTtmLmVuZD1pP2kodixuLHMpOnZ9fWVsc2UgaWYodm9pZCAwIT1mLnN0YXJ0KXt2YXIgZz1sLmNvbnZlcnQoZC5kYXRhLnN0YXJ0LCJEYXRlIikseT1uZXcgRGF0ZShnLnZhbHVlT2YoKStwKTtmLnN0YXJ0PWk/aSh5LG4scyk6eX19ZWxzZSBpZihkLmRyYWdSaWdodCl7aWYodGhpcy5vcHRpb25zLnJ0bCl7aWYodm9pZCAwIT1mLnN0YXJ0KXt2YXIgZz1sLmNvbnZlcnQoZC5kYXRhLnN0YXJ0LCJEYXRlIikseT1uZXcgRGF0ZShnLnZhbHVlT2YoKStwKTtmLnN0YXJ0PWk/aSh5LG4scyk6eX19ZWxzZSBpZih2b2lkIDAhPWYuZW5kKXt2YXIgbT1sLmNvbnZlcnQoZC5kYXRhLmVuZCwiRGF0ZSIpLHY9bmV3IERhdGUobS52YWx1ZU9mKCkrcCk7Zi5lbmQ9aT9pKHYsbixzKTp2fX1lbHNlIGlmKHZvaWQgMCE9Zi5zdGFydCl7dmFyIGc9bC5jb252ZXJ0KGQuZGF0YS5zdGFydCwiRGF0ZSIpLnZhbHVlT2YoKSx5PW5ldyBEYXRlKGcrcCk7aWYodm9pZCAwIT1mLmVuZCl7dmFyIG09bC5jb252ZXJ0KGQuZGF0YS5lbmQsIkRhdGUiKSxiPW0udmFsdWVPZigpLWcudmFsdWVPZigpO2Yuc3RhcnQ9aT9pKHksbixzKTp5LGYuZW5kPW5ldyBEYXRlKGYuc3RhcnQudmFsdWVPZigpK2IpfWVsc2UgZi5zdGFydD1pP2koeSxuLHMpOnl9aWYoYSYmIWQuZHJhZ0xlZnQmJiFkLmRyYWdSaWdodCYmbnVsbCE9aCYmdm9pZCAwIT1mLmdyb3VwKXt2YXIgXz1oLWQuZ3JvdXBPZmZzZXQ7Xz1NYXRoLm1heCgwLF8pLF89TWF0aC5taW4oZS5ncm91cElkcy5sZW5ndGgtMSxfKSxmLmdyb3VwPWUuZ3JvdXBJZHNbX119Zj10aGlzLl9jbG9uZUl0ZW1EYXRhKGYpLGUub3B0aW9ucy5vbk1vdmluZyhmLGZ1bmN0aW9uKHQpe3QmJmQuaXRlbS5zZXREYXRhKHRoaXMuX2Nsb25lSXRlbURhdGEodCwiRGF0ZSIpKX0uYmluZCh0aGlzKSl9fS5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfY2hhbmdlIil9fSxuLnByb3RvdHlwZS5fbW92ZVRvR3JvdXA9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdyb3Vwc1tlXTtpZihpJiZpLmdyb3VwSWQhPXQuZGF0YS5ncm91cCl7dmFyIG89dC5wYXJlbnQ7by5yZW1vdmUodCksby5vcmRlcigpLHQuZGF0YS5ncm91cD1pLmdyb3VwSWQsaS5hZGQodCksaS5vcmRlcigpfX0sbi5wcm90b3R5cGUuX29uRHJhZ0VuZD1mdW5jdGlvbih0KXtpZih0aGlzLnRvdWNoUGFyYW1zLml0ZW1Jc0RyYWdnaW5nPSExLHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzKXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBlPXRoaXMsaT10aGlzLml0ZW1zRGF0YS5nZXREYXRhU2V0KCksbz10aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wczt0aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wcz1udWxsLG8uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbz10Lml0ZW0uaWQ7aWYobnVsbCE9ZS5pdGVtc0RhdGEuZ2V0KG8sZS5pdGVtT3B0aW9ucykpe3ZhciBuPXRoaXMuX2Nsb25lSXRlbURhdGEodC5pdGVtLmRhdGEpO2Uub3B0aW9ucy5vbk1vdmUobixmdW5jdGlvbihuKXtuPyhuW2kuX2ZpZWxkSWRdPW8saS51cGRhdGUobikpOih0Lml0ZW0uc2V0RGF0YSh0LmRhdGEpLGUuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiKSl9KX1lbHNlIGUub3B0aW9ucy5vbkFkZCh0Lml0ZW0uZGF0YSxmdW5jdGlvbihpKXtlLl9yZW1vdmVJdGVtKHQuaXRlbSksaSYmZS5pdGVtc0RhdGEuZ2V0RGF0YVNldCgpLmFkZChpKSxlLmJvZHkuZW1pdHRlci5lbWl0KCJfY2hhbmdlIil9KX0uYmluZCh0aGlzKSl9fSxuLnByb3RvdHlwZS5fb25Hcm91cENsaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JvdXBGcm9tVGFyZ2V0KHQpO2lmKGUmJmUubmVzdGVkR3JvdXBzKXt2YXIgaT10aGlzLmdyb3Vwc0RhdGE7dGhpcy5ncm91cHNEYXRhIGluc3RhbmNlb2YgYyYmKGk9dGhpcy5ncm91cHNEYXRhLmdldERhdGFTZXQoKSksZS5zaG93TmVzdGVkPSFlLnNob3dOZXN0ZWQ7dmFyIG89aS5nZXQoZS5uZXN0ZWRHcm91cHMpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT10LnZpc2libGUmJih0LnZpc2libGU9ITApLHQudmlzaWJsZT0hIWUuc2hvd05lc3RlZCx0fSk7aWYoaS51cGRhdGUobyksZS5zaG93TmVzdGVkKWwucmVtb3ZlQ2xhc3NOYW1lKGUuZG9tLmxhYmVsLCJjb2xsYXBzZWQiKSxsLmFkZENsYXNzTmFtZShlLmRvbS5sYWJlbCwiZXhwYW5kZWQiKTtlbHNle2wucmVtb3ZlQ2xhc3NOYW1lKGUuZG9tLmxhYmVsLCJleHBhbmRlZCIpO3ZhciBuPXRoaXMub3B0aW9ucy5ydGw/ImNvbGxhcHNlZC1ydGwiOiJjb2xsYXBzZWQiO2wuYWRkQ2xhc3NOYW1lKGUuZG9tLmxhYmVsLG4pfX19LG4ucHJvdG90eXBlLl9vbkdyb3VwRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLm9yZGVyJiYodGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwPXRoaXMuZ3JvdXBGcm9tVGFyZ2V0KHQpLHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cCYmKHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5ncm91cFRvdWNoUGFyYW1zLm9yaWdpbmFsT3JkZXI9dGhpcy5ncm91cHNEYXRhLmdldElkcyh7b3JkZXI6dGhpcy5vcHRpb25zLmdyb3VwT3JkZXJ9KSkpfSxuLnByb3RvdHlwZS5fb25Hcm91cERyYWc9ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUub3JkZXImJnRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgZT10aGlzLmdyb3Vwc0RhdGE7dGhpcy5ncm91cHNEYXRhIGluc3RhbmNlb2YgYyYmKGU9dGhpcy5ncm91cHNEYXRhLmdldERhdGFTZXQoKSk7dmFyIGk9dGhpcy5ncm91cEZyb21UYXJnZXQodCk7aWYoaSYmaS5oZWlnaHQhPXRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC5oZWlnaHQpe3ZhciBvPWkudG9wPHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC50b3Asbj10LmNlbnRlcj90LmNlbnRlci55OnQuY2xpZW50WSxzPWwuZ2V0QWJzb2x1dGVUb3AoaS5kb20uZm9yZWdyb3VuZCkscj10aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXAuaGVpZ2h0O2lmKG8pe2lmKHMrcjxuKXJldHVybn1lbHNle2lmKHMraS5oZWlnaHQtcj5uKXJldHVybn19aWYoaSYmaSE9dGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwKXt2YXIgYT1lLmdldChpLmdyb3VwSWQpLGg9ZS5nZXQodGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLmdyb3VwSWQpO2gmJmEmJih0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlclN3YXAoaCxhLGUpLGUudXBkYXRlKGgpLGUudXBkYXRlKGEpKTt2YXIgZD1lLmdldElkcyh7b3JkZXI6dGhpcy5vcHRpb25zLmdyb3VwT3JkZXJ9KTtpZighbC5lcXVhbEFycmF5KGQsdGhpcy5ncm91cFRvdWNoUGFyYW1zLm9yaWdpbmFsT3JkZXIpKWZvcih2YXIgdT10aGlzLmdyb3VwVG91Y2hQYXJhbXMub3JpZ2luYWxPcmRlcixwPXRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC5ncm91cElkLGY9TWF0aC5taW4odS5sZW5ndGgsZC5sZW5ndGgpLG09MCx2PTAsZz0wO208Zjspe2Zvcig7bSt2PGYmJm0rZzxmJiZkW20rdl09PXVbbStnXTspbSsrO2lmKG0rdj49ZilicmVhaztpZihkW20rdl0hPXApaWYodVttK2ddIT1wKXt2YXIgeT1kLmluZGV4T2YodVttK2ddKSxiPWUuZ2V0KGRbbSt2XSksXz1lLmdldCh1W20rZ10pO3RoaXMub3B0aW9ucy5ncm91cE9yZGVyU3dhcChiLF8sZSksZS51cGRhdGUoYiksZS51cGRhdGUoXyk7dmFyIHc9ZFttK3ZdO2RbbSt2XT11W20rZ10sZFt5XT13LG0rK31lbHNlIGc9MTtlbHNlIHY9MX19fX0sbi5wcm90b3R5cGUuX29uR3JvdXBEcmFnRW5kPWZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLm9yZGVyJiZ0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXApe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGU9dGhpcyxpPWUuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC5ncm91cElkLG89ZS5ncm91cHNEYXRhLmdldERhdGFTZXQoKSxuPWwuZXh0ZW5kKHt9LG8uZ2V0KGkpKTtlLm9wdGlvbnMub25Nb3ZlR3JvdXAobixmdW5jdGlvbih0KXtpZih0KXRbby5fZmllbGRJZF09aSxvLnVwZGF0ZSh0KTtlbHNle3ZhciBuPW8uZ2V0SWRzKHtvcmRlcjplLm9wdGlvbnMuZ3JvdXBPcmRlcn0pO2lmKCFsLmVxdWFsQXJyYXkobixlLmdyb3VwVG91Y2hQYXJhbXMub3JpZ2luYWxPcmRlcikpZm9yKHZhciBzPWUuZ3JvdXBUb3VjaFBhcmFtcy5vcmlnaW5hbE9yZGVyLHI9TWF0aC5taW4ocy5sZW5ndGgsbi5sZW5ndGgpLGE9MDthPHI7KXtmb3IoO2E8ciYmblthXT09c1thXTspYSsrO2lmKGE+PXIpYnJlYWs7dmFyIGg9bi5pbmRleE9mKHNbYV0pLGQ9by5nZXQoblthXSksdT1vLmdldChzW2FdKTtlLm9wdGlvbnMuZ3JvdXBPcmRlclN3YXAoZCx1LG8pLG8udXBkYXRlKGQpLG8udXBkYXRlKHUpO3ZhciBjPW5bYV07blthXT1zW2FdLG5baF09YyxhKyt9fX0pLGUuYm9keS5lbWl0dGVyLmVtaXQoImdyb3VwRHJhZ2dlZCIse2dyb3VwSWQ6aX0pfX0sbi5wcm90b3R5cGUuX29uU2VsZWN0SXRlbT1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSl7dmFyIGU9dC5zcmNFdmVudCYmKHQuc3JjRXZlbnQuY3RybEtleXx8dC5zcmNFdmVudC5tZXRhS2V5KSxpPXQuc3JjRXZlbnQmJnQuc3JjRXZlbnQuc2hpZnRLZXk7aWYoZXx8aSlyZXR1cm4gdm9pZCB0aGlzLl9vbk11bHRpU2VsZWN0SXRlbSh0KTt2YXIgbz10aGlzLmdldFNlbGVjdGlvbigpLG49dGhpcy5pdGVtRnJvbVRhcmdldCh0KSxzPW4/W24uaWRdOltdO3RoaXMuc2V0U2VsZWN0aW9uKHMpO3ZhciByPXRoaXMuZ2V0U2VsZWN0aW9uKCk7KHIubGVuZ3RoPjB8fG8ubGVuZ3RoPjApJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzZWxlY3QiLHtpdGVtczpyLGV2ZW50OnR9KX19LG4ucHJvdG90eXBlLl9vbk1vdXNlT3Zlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLml0ZW1Gcm9tVGFyZ2V0KHQpO2lmKGUpe2lmKGUhPT10aGlzLml0ZW1Gcm9tUmVsYXRlZFRhcmdldCh0KSl7dmFyIGk9ZS5nZXRUaXRsZSgpO2lmKHRoaXMub3B0aW9ucy5zaG93VG9vbHRpcHMmJmkpe251bGw9PXRoaXMucG9wdXAmJih0aGlzLnBvcHVwPW5ldyB3KHRoaXMuYm9keS5kb20ucm9vdCx0aGlzLm9wdGlvbnMudG9vbHRpcC5vdmVyZmxvd01ldGhvZHx8ImZsaXAiKSksdGhpcy5wb3B1cC5zZXRUZXh0KGkpO3ZhciBvPXRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyO3RoaXMucG9wdXAuc2V0UG9zaXRpb24odC5jbGllbnRYLWwuZ2V0QWJzb2x1dGVMZWZ0KG8pK28ub2Zmc2V0TGVmdCx0LmNsaWVudFktbC5nZXRBYnNvbHV0ZVRvcChvKStvLm9mZnNldFRvcCksdGhpcy5wb3B1cC5zaG93KCl9ZWxzZSBudWxsIT10aGlzLnBvcHVwJiZ0aGlzLnBvcHVwLmhpZGUoKTt0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJpdGVtb3ZlciIse2l0ZW06ZS5pZCxldmVudDp0fSl9fX0sbi5wcm90b3R5cGUuX29uTW91c2VPdXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pdGVtRnJvbVRhcmdldCh0KTtpZihlKXtlIT09dGhpcy5pdGVtRnJvbVJlbGF0ZWRUYXJnZXQodCkmJihudWxsIT10aGlzLnBvcHVwJiZ0aGlzLnBvcHVwLmhpZGUoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJpdGVtb3V0Iix7aXRlbTplLmlkLGV2ZW50OnR9KSl9fSxuLnByb3RvdHlwZS5fb25Nb3VzZU1vdmU9ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtRnJvbVRhcmdldCh0KSYmdGhpcy5vcHRpb25zLnNob3dUb29sdGlwcyYmdGhpcy5vcHRpb25zLnRvb2x0aXAuZm9sbG93TW91c2UmJnRoaXMucG9wdXAmJiF0aGlzLnBvcHVwLmhpZGRlbil7dmFyIGU9dGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXI7dGhpcy5wb3B1cC5zZXRQb3NpdGlvbih0LmNsaWVudFgtbC5nZXRBYnNvbHV0ZUxlZnQoZSkrZS5vZmZzZXRMZWZ0LHQuY2xpZW50WS1sLmdldEFic29sdXRlVG9wKGUpK2Uub2Zmc2V0VG9wKSx0aGlzLnBvcHVwLnNob3coKX19LG4ucHJvdG90eXBlLl9vbk1vdXNlV2hlZWw9ZnVuY3Rpb24odCl7dGhpcy50b3VjaFBhcmFtcy5pdGVtSXNEcmFnZ2luZyYmdGhpcy5fb25EcmFnRW5kKHQpfSxuLnByb3RvdHlwZS5fb25VcGRhdGVJdGVtPWZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5zZWxlY3RhYmxlJiZ0aGlzLm9wdGlvbnMuZWRpdGFibGUuYWRkKXt2YXIgZT10aGlzO2lmKHQpe3ZhciBpPWUuaXRlbXNEYXRhLmdldCh0LmlkKTt0aGlzLm9wdGlvbnMub25VcGRhdGUoaSxmdW5jdGlvbih0KXt0JiZlLml0ZW1zRGF0YS5nZXREYXRhU2V0KCkudXBkYXRlKHQpfSl9fX0sbi5wcm90b3R5cGUuX29uQWRkSXRlbT1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLmFkZCl7dmFyIGU9dGhpcyxpPXRoaXMub3B0aW9ucy5zbmFwfHxudWxsO2lmKCF0aGlzLml0ZW1Gcm9tVGFyZ2V0KHQpKXtpZih0aGlzLm9wdGlvbnMucnRsKXZhciBvPWwuZ2V0QWJzb2x1dGVSaWdodCh0aGlzLmRvbS5mcmFtZSksbj1vLXQuY2VudGVyLng7ZWxzZSB2YXIgbz1sLmdldEFic29sdXRlTGVmdCh0aGlzLmRvbS5mcmFtZSksbj10LmNlbnRlci54LW87dmFyIHMscj10aGlzLmJvZHkudXRpbC50b1RpbWUobiksYT10aGlzLmJvZHkudXRpbC5nZXRTY2FsZSgpLGg9dGhpcy5ib2R5LnV0aWwuZ2V0U3RlcCgpO2lmKCJkcm9wIj09dC50eXBlKXtpZihzPUpTT04ucGFyc2UodC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgidGV4dCIpKSxzLmNvbnRlbnQ9cy5jb250ZW50P3MuY29udGVudDoibmV3IGl0ZW0iLHMuc3RhcnQ9cy5zdGFydD9zLnN0YXJ0Omk/aShyLGEsaCk6cixzLnR5cGU9cy50eXBlfHwiYm94IixzW3RoaXMuaXRlbXNEYXRhLl9maWVsZElkXT1zLmlkfHxsLnJhbmRvbVVVSUQoKSwicmFuZ2UiPT1zLnR5cGUmJiFzLmVuZCl7dmFyIGQ9dGhpcy5ib2R5LnV0aWwudG9UaW1lKG4rdGhpcy5wcm9wcy53aWR0aC81KTtzLmVuZD1pP2koZCxhLGgpOmR9fWVsc2UgaWYocz17c3RhcnQ6aT9pKHIsYSxoKTpyLGNvbnRlbnQ6Im5ldyBpdGVtIn0sc1t0aGlzLml0ZW1zRGF0YS5fZmllbGRJZF09bC5yYW5kb21VVUlEKCksInJhbmdlIj09PXRoaXMub3B0aW9ucy50eXBlKXt2YXIgZD10aGlzLmJvZHkudXRpbC50b1RpbWUobit0aGlzLnByb3BzLndpZHRoLzUpO3MuZW5kPWk/aShkLGEsaCk6ZH12YXIgdT10aGlzLmdyb3VwRnJvbVRhcmdldCh0KTt1JiYocy5ncm91cD11Lmdyb3VwSWQpLHM9dGhpcy5fY2xvbmVJdGVtRGF0YShzKSx0aGlzLm9wdGlvbnMub25BZGQocyxmdW5jdGlvbihpKXtpJiYoZS5pdGVtc0RhdGEuZ2V0RGF0YVNldCgpLmFkZChpKSwiZHJvcCI9PXQudHlwZSYmZS5zZXRTZWxlY3Rpb24oW2kuaWRdKSl9KX19fSxuLnByb3RvdHlwZS5fb25NdWx0aVNlbGVjdEl0ZW09ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLnNlbGVjdGFibGUpe3ZhciBlPXRoaXMuaXRlbUZyb21UYXJnZXQodCk7aWYoZSl7dmFyIGk9dGhpcy5vcHRpb25zLm11bHRpc2VsZWN0P3RoaXMuZ2V0U2VsZWN0aW9uKCk6W107aWYoKHQuc3JjRXZlbnQmJnQuc3JjRXZlbnQuc2hpZnRLZXl8fCExKSYmdGhpcy5vcHRpb25zLm11bHRpc2VsZWN0KXt2YXIgbz10aGlzLml0ZW1zRGF0YS5nZXQoZS5pZCkuZ3JvdXAscz12b2lkIDA7dGhpcy5vcHRpb25zLm11bHRpc2VsZWN0UGVyR3JvdXAmJmkubGVuZ3RoPjAmJihzPXRoaXMuaXRlbXNEYXRhLmdldChpWzBdKS5ncm91cCksdGhpcy5vcHRpb25zLm11bHRpc2VsZWN0UGVyR3JvdXAmJnZvaWQgMCE9cyYmcyE9b3x8aS5wdXNoKGUuaWQpO3ZhciByPW4uX2dldEl0ZW1SYW5nZSh0aGlzLml0ZW1zRGF0YS5nZXQoaSx0aGlzLml0ZW1PcHRpb25zKSk7aWYoIXRoaXMub3B0aW9ucy5tdWx0aXNlbGVjdFBlckdyb3VwfHxzPT1vKXtpPVtdO2Zvcih2YXIgYSBpbiB0aGlzLml0ZW1zKWlmKHRoaXMuaXRlbXMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBoPXRoaXMuaXRlbXNbYV0sZD1oLmRhdGEuc3RhcnQsbD12b2lkIDAhPT1oLmRhdGEuZW5kP2guZGF0YS5lbmQ6ZDshKGQ+PXIubWluJiZsPD1yLm1heCl8fHRoaXMub3B0aW9ucy5tdWx0aXNlbGVjdFBlckdyb3VwJiZzIT10aGlzLml0ZW1zRGF0YS5nZXQoaC5pZCkuZ3JvdXB8fGggaW5zdGFuY2VvZiBffHxpLnB1c2goaC5pZCl9fX1lbHNle3ZhciB1PWkuaW5kZXhPZihlLmlkKTstMT09dT9pLnB1c2goZS5pZCk6aS5zcGxpY2UodSwxKX10aGlzLnNldFNlbGVjdGlvbihpKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzZWxlY3QiLHtpdGVtczp0aGlzLmdldFNlbGVjdGlvbigpLGV2ZW50OnR9KX19fSxuLl9nZXRJdGVtUmFuZ2U9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbCxpPW51bGw7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXsobnVsbD09aXx8dC5zdGFydDxpKSYmKGk9dC5zdGFydCksdm9pZCAwIT10LmVuZD8obnVsbD09ZXx8dC5lbmQ+ZSkmJihlPXQuZW5kKToobnVsbD09ZXx8dC5zdGFydD5lKSYmKGU9dC5zdGFydCl9KSx7bWluOmksbWF4OmV9fSxuLnByb3RvdHlwZS5pdGVtRnJvbUVsZW1lbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQ7ZTspe2lmKGUuaGFzT3duUHJvcGVydHkoInRpbWVsaW5lLWl0ZW0iKSlyZXR1cm4gZVsidGltZWxpbmUtaXRlbSJdO2U9ZS5wYXJlbnROb2RlfXJldHVybiBudWxsfSxuLnByb3RvdHlwZS5pdGVtRnJvbVRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVtRnJvbUVsZW1lbnQodC50YXJnZXQpfSxuLnByb3RvdHlwZS5pdGVtRnJvbVJlbGF0ZWRUYXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlbUZyb21FbGVtZW50KHQucmVsYXRlZFRhcmdldCl9LG4ucHJvdG90eXBlLmdyb3VwRnJvbVRhcmdldD1mdW5jdGlvbih0KXt2YXIgZT10LmNlbnRlcj90LmNlbnRlci55OnQuY2xpZW50WSxpPXRoaXMuZ3JvdXBJZHM7aS5sZW5ndGg8PTAmJnRoaXMuZ3JvdXBzRGF0YSYmKGk9dGhpcy5ncm91cHNEYXRhLmdldElkcyh7b3JkZXI6dGhpcy5vcHRpb25zLmdyb3VwT3JkZXJ9KSk7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBuPWlbb10scz10aGlzLmdyb3Vwc1tuXSxyPXMuZG9tLmZvcmVncm91bmQsYT1sLmdldEFic29sdXRlVG9wKHIpO2lmKGU+YSYmZTxhK3Iub2Zmc2V0SGVpZ2h0KXJldHVybiBzO2lmKCJ0b3AiPT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW0pe2lmKG89PT10aGlzLmdyb3VwSWRzLmxlbmd0aC0xJiZlPmEpcmV0dXJuIHN9ZWxzZSBpZigwPT09byYmZTxhK3Iub2Zmc2V0KXJldHVybiBzfXJldHVybiBudWxsfSxuLml0ZW1TZXRGcm9tVGFyZ2V0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnRhcmdldDtlOyl7aWYoZS5oYXNPd25Qcm9wZXJ0eSgidGltZWxpbmUtaXRlbXNldCIpKXJldHVybiBlWyJ0aW1lbGluZS1pdGVtc2V0Il07ZT1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9LG4ucHJvdG90eXBlLl9jbG9uZUl0ZW1EYXRhPWZ1bmN0aW9uKHQsZSl7dmFyIGk9bC5leHRlbmQoe30sdCk7cmV0dXJuIGV8fChlPXRoaXMuaXRlbXNEYXRhLmdldERhdGFTZXQoKS5fb3B0aW9ucy50eXBlKSx2b2lkIDAhPWkuc3RhcnQmJihpLnN0YXJ0PWwuY29udmVydChpLnN0YXJ0LGUmJmUuc3RhcnR8fCJEYXRlIikpLHZvaWQgMCE9aS5lbmQmJihpLmVuZD1sLmNvbnZlcnQoaS5lbmQsZSYmZS5lbmR8fCJEYXRlIikpLGl9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSxzKXt0aGlzLm1vbWVudD1uLHRoaXMuY3VycmVudD10aGlzLm1vbWVudCgpLHRoaXMuX3N0YXJ0PXRoaXMubW9tZW50KCksdGhpcy5fZW5kPXRoaXMubW9tZW50KCksdGhpcy5hdXRvU2NhbGU9ITAsdGhpcy5zY2FsZT0iZGF5Iix0aGlzLnN0ZXA9MSx0aGlzLnNldFJhbmdlKHQsZSxpKSx0aGlzLnN3aXRjaGVkRGF5PSExLHRoaXMuc3dpdGNoZWRNb250aD0hMSx0aGlzLnN3aXRjaGVkWWVhcj0hMSxBcnJheS5pc0FycmF5KHMpP3RoaXMuaGlkZGVuRGF0ZXM9czp0aGlzLmhpZGRlbkRhdGVzPXZvaWQgMCE9cz9bc106W10sdGhpcy5mb3JtYXQ9by5GT1JNQVR9dmFyIG49aSg4Mikscz1pKDEyMSkscj1pKDEpO28uRk9STUFUPXttaW5vckxhYmVsczp7bWlsbGlzZWNvbmQ6IlNTUyIsc2Vjb25kOiJzIixtaW51dGU6IkhIOm1tIixob3VyOiJISDptbSIsd2Vla2RheToiZGRkIEQiLGRheToiRCIsd2VlazoidyIsbW9udGg6Ik1NTSIseWVhcjoiWVlZWSJ9LG1ham9yTGFiZWxzOnttaWxsaXNlY29uZDoiSEg6bW06c3MiLHNlY29uZDoiRCBNTU1NIEhIOm1tIixtaW51dGU6ImRkZCBEIE1NTU0iLGhvdXI6ImRkZCBEIE1NTU0iLHdlZWtkYXk6Ik1NTU0gWVlZWSIsZGF5OiJNTU1NIFlZWVkiLHdlZWs6Ik1NTU0gWVlZWSIsbW9udGg6IllZWVkiLHllYXI6IiJ9fSxvLnByb3RvdHlwZS5zZXRNb21lbnQ9ZnVuY3Rpb24odCl7dGhpcy5tb21lbnQ9dCx0aGlzLmN1cnJlbnQ9dGhpcy5tb21lbnQodGhpcy5jdXJyZW50LnZhbHVlT2YoKSksdGhpcy5fc3RhcnQ9dGhpcy5tb21lbnQodGhpcy5fc3RhcnQudmFsdWVPZigpKSx0aGlzLl9lbmQ9dGhpcy5tb21lbnQodGhpcy5fZW5kLnZhbHVlT2YoKSl9LG8ucHJvdG90eXBlLnNldEZvcm1hdD1mdW5jdGlvbih0KXt2YXIgZT1yLmRlZXBFeHRlbmQoe30sby5GT1JNQVQpO3RoaXMuZm9ybWF0PXIuZGVlcEV4dGVuZChlLHQpfSxvLnByb3RvdHlwZS5zZXRSYW5nZT1mdW5jdGlvbih0LGUsaSl7aWYoISh0IGluc3RhbmNlb2YgRGF0ZSYmZSBpbnN0YW5jZW9mIERhdGUpKXRocm93Ik5vIGxlZ2FsIHN0YXJ0IG9yIGVuZCBkYXRlIGluIG1ldGhvZCBzZXRSYW5nZSI7dGhpcy5fc3RhcnQ9dm9pZCAwIT10P3RoaXMubW9tZW50KHQudmFsdWVPZigpKTpuZXcgRGF0ZSx0aGlzLl9lbmQ9dm9pZCAwIT1lP3RoaXMubW9tZW50KGUudmFsdWVPZigpKTpuZXcgRGF0ZSx0aGlzLmF1dG9TY2FsZSYmdGhpcy5zZXRNaW5pbXVtU3RlcChpKX0sby5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnQ9dGhpcy5fc3RhcnQuY2xvbmUoKSx0aGlzLnJvdW5kVG9NaW5vcigpfSxvLnByb3RvdHlwZS5yb3VuZFRvTWlub3I9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZSJ5ZWFyIjp0aGlzLmN1cnJlbnQueWVhcih0aGlzLnN0ZXAqTWF0aC5mbG9vcih0aGlzLmN1cnJlbnQueWVhcigpL3RoaXMuc3RlcCkpLHRoaXMuY3VycmVudC5tb250aCgwKTtjYXNlIm1vbnRoIjp0aGlzLmN1cnJlbnQuZGF0ZSgxKTtjYXNlIndlZWsiOnRoaXMuY3VycmVudC53ZWVrZGF5KDApO2Nhc2UiZGF5IjpjYXNlIndlZWtkYXkiOnRoaXMuY3VycmVudC5ob3VycygwKTtjYXNlImhvdXIiOnRoaXMuY3VycmVudC5taW51dGVzKDApO2Nhc2UibWludXRlIjp0aGlzLmN1cnJlbnQuc2Vjb25kcygwKTtjYXNlInNlY29uZCI6dGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygwKX1pZigxIT10aGlzLnN0ZXApc3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2UibWlsbGlzZWNvbmQiOnRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQubWlsbGlzZWNvbmRzKCkldGhpcy5zdGVwLCJtaWxsaXNlY29uZHMiKTticmVhaztjYXNlInNlY29uZCI6dGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5zZWNvbmRzKCkldGhpcy5zdGVwLCJzZWNvbmRzIik7YnJlYWs7Y2FzZSJtaW51dGUiOnRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQubWludXRlcygpJXRoaXMuc3RlcCwibWludXRlcyIpO2JyZWFrO2Nhc2UiaG91ciI6dGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5ob3VycygpJXRoaXMuc3RlcCwiaG91cnMiKTticmVhaztjYXNlIndlZWtkYXkiOmNhc2UiZGF5Ijp0aGlzLmN1cnJlbnQuc3VidHJhY3QoKHRoaXMuY3VycmVudC5kYXRlKCktMSkldGhpcy5zdGVwLCJkYXkiKTticmVhaztjYXNlIndlZWsiOnRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQud2VlaygpJXRoaXMuc3RlcCwid2VlayIpO2JyZWFrO2Nhc2UibW9udGgiOnRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQubW9udGgoKSV0aGlzLnN0ZXAsIm1vbnRoIik7YnJlYWs7Y2FzZSJ5ZWFyIjp0aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50LnllYXIoKSV0aGlzLnN0ZXAsInllYXIiKX19LG8ucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50LnZhbHVlT2YoKTw9dGhpcy5fZW5kLnZhbHVlT2YoKX0sby5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY3VycmVudC52YWx1ZU9mKCk7c3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2UibWlsbGlzZWNvbmQiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCJtaWxsaXNlY29uZCIpO2JyZWFrO2Nhc2Uic2Vjb25kIjp0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwic2Vjb25kIik7YnJlYWs7Y2FzZSJtaW51dGUiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCJtaW51dGUiKTticmVhaztjYXNlImhvdXIiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCJob3VyIiksdGhpcy5jdXJyZW50Lm1vbnRoKCk8Nj90aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50LmhvdXJzKCkldGhpcy5zdGVwLCJob3VyIik6dGhpcy5jdXJyZW50LmhvdXJzKCkldGhpcy5zdGVwIT0wJiZ0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcC10aGlzLmN1cnJlbnQuaG91cnMoKSV0aGlzLnN0ZXAsImhvdXIiKTticmVhaztjYXNlIndlZWtkYXkiOmNhc2UiZGF5Ijp0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwiZGF5Iik7YnJlYWs7Y2FzZSJ3ZWVrIjppZigwIT09dGhpcy5jdXJyZW50LndlZWtkYXkoKSl0aGlzLmN1cnJlbnQud2Vla2RheSgwKSx0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwid2VlayIpO2Vsc2V7dmFyIGU9dGhpcy5jdXJyZW50LmNsb25lKCk7ZS5hZGQoMSwid2VlayIpLGUuaXNTYW1lKHRoaXMuY3VycmVudCwibW9udGgiKT90aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwid2VlayIpOih0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwid2VlayIpLHRoaXMuY3VycmVudC5kYXRlKDEpKX1icmVhaztjYXNlIm1vbnRoIjp0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwibW9udGgiKTticmVhaztjYXNlInllYXIiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCJ5ZWFyIil9aWYoMSE9dGhpcy5zdGVwKXN3aXRjaCh0aGlzLnNjYWxlKXtjYXNlIm1pbGxpc2Vjb25kIjp0aGlzLmN1cnJlbnQubWlsbGlzZWNvbmRzKCk+MCYmdGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygpPHRoaXMuc3RlcCYmdGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygwKTticmVhaztjYXNlInNlY29uZCI6dGhpcy5jdXJyZW50LnNlY29uZHMoKT4wJiZ0aGlzLmN1cnJlbnQuc2Vjb25kcygpPHRoaXMuc3RlcCYmdGhpcy5jdXJyZW50LnNlY29uZHMoMCk7YnJlYWs7Y2FzZSJtaW51dGUiOnRoaXMuY3VycmVudC5taW51dGVzKCk+MCYmdGhpcy5jdXJyZW50Lm1pbnV0ZXMoKTx0aGlzLnN0ZXAmJnRoaXMuY3VycmVudC5taW51dGVzKDApO2JyZWFrO2Nhc2UiaG91ciI6dGhpcy5jdXJyZW50LmhvdXJzKCk+MCYmdGhpcy5jdXJyZW50LmhvdXJzKCk8dGhpcy5zdGVwJiZ0aGlzLmN1cnJlbnQuaG91cnMoMCk7YnJlYWs7Y2FzZSJ3ZWVrZGF5IjpjYXNlImRheSI6dGhpcy5jdXJyZW50LmRhdGUoKTx0aGlzLnN0ZXArMSYmdGhpcy5jdXJyZW50LmRhdGUoMSk7YnJlYWs7Y2FzZSJ3ZWVrIjp0aGlzLmN1cnJlbnQud2VlaygpPHRoaXMuc3RlcCYmdGhpcy5jdXJyZW50LndlZWsoMSk7YnJlYWs7Y2FzZSJtb250aCI6dGhpcy5jdXJyZW50Lm1vbnRoKCk8dGhpcy5zdGVwJiZ0aGlzLmN1cnJlbnQubW9udGgoMCl9dGhpcy5jdXJyZW50LnZhbHVlT2YoKT09dCYmKHRoaXMuY3VycmVudD10aGlzLl9lbmQuY2xvbmUoKSksdGhpcy5zd2l0Y2hlZERheT0hMSx0aGlzLnN3aXRjaGVkTW9udGg9ITEsdGhpcy5zd2l0Y2hlZFllYXI9ITEscy5zdGVwT3ZlckhpZGRlbkRhdGVzKHRoaXMubW9tZW50LHRoaXMsdCl9LG8ucHJvdG90eXBlLmdldEN1cnJlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50fSxvLnByb3RvdHlwZS5zZXRTY2FsZT1mdW5jdGlvbih0KXt0JiYic3RyaW5nIj09dHlwZW9mIHQuc2NhbGUmJih0aGlzLnNjYWxlPXQuc2NhbGUsdGhpcy5zdGVwPXQuc3RlcD4wP3Quc3RlcDoxLHRoaXMuYXV0b1NjYWxlPSExKX0sby5wcm90b3R5cGUuc2V0QXV0b1NjYWxlPWZ1bmN0aW9uKHQpe3RoaXMuYXV0b1NjYWxlPXR9LG8ucHJvdG90eXBlLnNldE1pbmltdW1TdGVwPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9dCl7MzExMDRlOT50JiYodGhpcy5zY2FsZT0ieWVhciIsdGhpcy5zdGVwPTFlMyksMTU1NTJlOT50JiYodGhpcy5zY2FsZT0ieWVhciIsdGhpcy5zdGVwPTUwMCksMzExMDRlOD50JiYodGhpcy5zY2FsZT0ieWVhciIsdGhpcy5zdGVwPTEwMCksMTU1NTJlOD50JiYodGhpcy5zY2FsZT0ieWVhciIsdGhpcy5zdGVwPTUwKSwzMTEwNGU3PnQmJih0aGlzLnNjYWxlPSJ5ZWFyIix0aGlzLnN0ZXA9MTApLDE1NTUyZTc+dCYmKHRoaXMuc2NhbGU9InllYXIiLHRoaXMuc3RlcD01KSwzMTEwNGU2PnQmJih0aGlzLnNjYWxlPSJ5ZWFyIix0aGlzLnN0ZXA9MSksNzc3NmU2PnQmJih0aGlzLnNjYWxlPSJtb250aCIsdGhpcy5zdGVwPTMpLDI1OTJlNj50JiYodGhpcy5zY2FsZT0ibW9udGgiLHRoaXMuc3RlcD0xKSw0MzJlNj50JiYodGhpcy5zY2FsZT0iZGF5Iix0aGlzLnN0ZXA9NSksMTcyOGU1PnQmJih0aGlzLnNjYWxlPSJkYXkiLHRoaXMuc3RlcD0yKSw4NjRlNT50JiYodGhpcy5zY2FsZT0iZGF5Iix0aGlzLnN0ZXA9MSksNDMyZTU+dCYmKHRoaXMuc2NhbGU9IndlZWtkYXkiLHRoaXMuc3RlcD0xKSwxNDRlNT50JiYodGhpcy5zY2FsZT0iaG91ciIsdGhpcy5zdGVwPTQpLDM2ZTU+dCYmKHRoaXMuc2NhbGU9ImhvdXIiLHRoaXMuc3RlcD0xKSw5ZTU+dCYmKHRoaXMuc2NhbGU9Im1pbnV0ZSIsdGhpcy5zdGVwPTE1KSw2ZTU+dCYmKHRoaXMuc2NhbGU9Im1pbnV0ZSIsdGhpcy5zdGVwPTEwKSwzZTU+dCYmKHRoaXMuc2NhbGU9Im1pbnV0ZSIsdGhpcy5zdGVwPTUpLDZlND50JiYodGhpcy5zY2FsZT0ibWludXRlIix0aGlzLnN0ZXA9MSksMTVlMz50JiYodGhpcy5zY2FsZT0ic2Vjb25kIix0aGlzLnN0ZXA9MTUpLDFlND50JiYodGhpcy5zY2FsZT0ic2Vjb25kIix0aGlzLnN0ZXA9MTApLDVlMz50JiYodGhpcy5zY2FsZT0ic2Vjb25kIix0aGlzLnN0ZXA9NSksMWUzPnQmJih0aGlzLnNjYWxlPSJzZWNvbmQiLHRoaXMuc3RlcD0xKSwyMDA+dCYmKHRoaXMuc2NhbGU9Im1pbGxpc2Vjb25kIix0aGlzLnN0ZXA9MjAwKSwxMDA+dCYmKHRoaXMuc2NhbGU9Im1pbGxpc2Vjb25kIix0aGlzLnN0ZXA9MTAwKSw1MD50JiYodGhpcy5zY2FsZT0ibWlsbGlzZWNvbmQiLHRoaXMuc3RlcD01MCksMTA+dCYmKHRoaXMuc2NhbGU9Im1pbGxpc2Vjb25kIix0aGlzLnN0ZXA9MTApLDU+dCYmKHRoaXMuc2NhbGU9Im1pbGxpc2Vjb25kIix0aGlzLnN0ZXA9NSksMT50JiYodGhpcy5zY2FsZT0ibWlsbGlzZWNvbmQiLHRoaXMuc3RlcD0xKX19LG8uc25hcD1mdW5jdGlvbih0LGUsaSl7dmFyIG89bih0KTtpZigieWVhciI9PWUpe3ZhciBzPW8ueWVhcigpK01hdGgucm91bmQoby5tb250aCgpLzEyKTtvLnllYXIoTWF0aC5yb3VuZChzL2kpKmkpLG8ubW9udGgoMCksby5kYXRlKDApLG8uaG91cnMoMCksby5taW51dGVzKDApLG8uc2Vjb25kcygwKSxvLm1pbGxpc2Vjb25kcygwKX1lbHNlIGlmKCJtb250aCI9PWUpby5kYXRlKCk+MTU/KG8uZGF0ZSgxKSxvLmFkZCgxLCJtb250aCIpKTpvLmRhdGUoMSksby5ob3VycygwKSxvLm1pbnV0ZXMoMCksby5zZWNvbmRzKDApLG8ubWlsbGlzZWNvbmRzKDApO2Vsc2UgaWYoIndlZWsiPT1lKW8ud2Vla2RheSgpPjI/KG8ud2Vla2RheSgwKSxvLmFkZCgxLCJ3ZWVrIikpOm8ud2Vla2RheSgwKSxvLmhvdXJzKDApLG8ubWludXRlcygwKSxvLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCk7ZWxzZSBpZigiZGF5Ij09ZSl7c3dpdGNoKGkpe2Nhc2UgNTpjYXNlIDI6by5ob3VycygyNCpNYXRoLnJvdW5kKG8uaG91cnMoKS8yNCkpO2JyZWFrO2RlZmF1bHQ6by5ob3VycygxMipNYXRoLnJvdW5kKG8uaG91cnMoKS8xMikpfW8ubWludXRlcygwKSxvLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZigid2Vla2RheSI9PWUpe3N3aXRjaChpKXtjYXNlIDU6Y2FzZSAyOm8uaG91cnMoMTIqTWF0aC5yb3VuZChvLmhvdXJzKCkvMTIpKTticmVhaztkZWZhdWx0Om8uaG91cnMoNipNYXRoLnJvdW5kKG8uaG91cnMoKS82KSl9by5taW51dGVzKDApLG8uc2Vjb25kcygwKSxvLm1pbGxpc2Vjb25kcygwKX1lbHNlIGlmKCJob3VyIj09ZSl7c3dpdGNoKGkpe2Nhc2UgNDpvLm1pbnV0ZXMoNjAqTWF0aC5yb3VuZChvLm1pbnV0ZXMoKS82MCkpO2JyZWFrO2RlZmF1bHQ6by5taW51dGVzKDMwKk1hdGgucm91bmQoby5taW51dGVzKCkvMzApKX1vLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZigibWludXRlIj09ZSl7c3dpdGNoKGkpe2Nhc2UgMTU6Y2FzZSAxMDpvLm1pbnV0ZXMoNSpNYXRoLnJvdW5kKG8ubWludXRlcygpLzUpKSxvLnNlY29uZHMoMCk7YnJlYWs7Y2FzZSA1Om8uc2Vjb25kcyg2MCpNYXRoLnJvdW5kKG8uc2Vjb25kcygpLzYwKSk7YnJlYWs7ZGVmYXVsdDpvLnNlY29uZHMoMzAqTWF0aC5yb3VuZChvLnNlY29uZHMoKS8zMCkpfW8ubWlsbGlzZWNvbmRzKDApfWVsc2UgaWYoInNlY29uZCI9PWUpc3dpdGNoKGkpe2Nhc2UgMTU6Y2FzZSAxMDpvLnNlY29uZHMoNSpNYXRoLnJvdW5kKG8uc2Vjb25kcygpLzUpKSxvLm1pbGxpc2Vjb25kcygwKTticmVhaztjYXNlIDU6by5taWxsaXNlY29uZHMoMWUzKk1hdGgucm91bmQoby5taWxsaXNlY29uZHMoKS8xZTMpKTticmVhaztkZWZhdWx0Om8ubWlsbGlzZWNvbmRzKDUwMCpNYXRoLnJvdW5kKG8ubWlsbGlzZWNvbmRzKCkvNTAwKSl9ZWxzZSBpZigibWlsbGlzZWNvbmQiPT1lKXt2YXIgcj1pPjU/aS8yOjE7by5taWxsaXNlY29uZHMoTWF0aC5yb3VuZChvLm1pbGxpc2Vjb25kcygpL3IpKnIpfXJldHVybiBvfSxvLnByb3RvdHlwZS5pc01ham9yPWZ1bmN0aW9uKCl7aWYoMT09dGhpcy5zd2l0Y2hlZFllYXIpc3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2UieWVhciI6Y2FzZSJtb250aCI6Y2FzZSJ3ZWVrIjpjYXNlIndlZWtkYXkiOmNhc2UiZGF5IjpjYXNlImhvdXIiOmNhc2UibWludXRlIjpjYXNlInNlY29uZCI6Y2FzZSJtaWxsaXNlY29uZCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX1lbHNlIGlmKDE9PXRoaXMuc3dpdGNoZWRNb250aClzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZSJ3ZWVrIjpjYXNlIndlZWtkYXkiOmNhc2UiZGF5IjpjYXNlImhvdXIiOmNhc2UibWludXRlIjpjYXNlInNlY29uZCI6Y2FzZSJtaWxsaXNlY29uZCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX1lbHNlIGlmKDE9PXRoaXMuc3dpdGNoZWREYXkpc3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2UibWlsbGlzZWNvbmQiOmNhc2Uic2Vjb25kIjpjYXNlIm1pbnV0ZSI6Y2FzZSJob3VyIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfXZhciB0PXRoaXMubW9tZW50KHRoaXMuY3VycmVudCk7c3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2UibWlsbGlzZWNvbmQiOnJldHVybiAwPT10Lm1pbGxpc2Vjb25kcygpO2Nhc2Uic2Vjb25kIjpyZXR1cm4gMD09dC5zZWNvbmRzKCk7Y2FzZSJtaW51dGUiOnJldHVybiAwPT10LmhvdXJzKCkmJjA9PXQubWludXRlcygpO2Nhc2UiaG91ciI6cmV0dXJuIDA9PXQuaG91cnMoKTtjYXNlIndlZWtkYXkiOmNhc2UiZGF5IjpjYXNlIndlZWsiOnJldHVybiAxPT10LmRhdGUoKTtjYXNlIm1vbnRoIjpyZXR1cm4gMD09dC5tb250aCgpO2Nhc2UieWVhciI6ZGVmYXVsdDpyZXR1cm4hMX19LG8ucHJvdG90eXBlLmdldExhYmVsTWlub3I9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT10JiYodD10aGlzLmN1cnJlbnQpLHQgaW5zdGFuY2VvZiBEYXRlJiYodD10aGlzLm1vbWVudCh0KSksImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZm9ybWF0Lm1pbm9yTGFiZWxzKXJldHVybiB0aGlzLmZvcm1hdC5taW5vckxhYmVscyh0LHRoaXMuc2NhbGUsdGhpcy5zdGVwKTt2YXIgZT10aGlzLmZvcm1hdC5taW5vckxhYmVsc1t0aGlzLnNjYWxlXTtzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZSJ3ZWVrIjppZih0aGlzLmlzTWFqb3IoKSYmMCE9PXQud2Vla2RheSgpKXJldHVybiIiO2RlZmF1bHQ6cmV0dXJuIGUmJmUubGVuZ3RoPjA/dGhpcy5tb21lbnQodCkuZm9ybWF0KGUpOiIifX0sby5wcm90b3R5cGUuZ2V0TGFiZWxNYWpvcj1mdW5jdGlvbih0KXtpZih2b2lkIDA9PXQmJih0PXRoaXMuY3VycmVudCksdCBpbnN0YW5jZW9mIERhdGUmJih0PXRoaXMubW9tZW50KHQpKSwiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mb3JtYXQubWFqb3JMYWJlbHMpcmV0dXJuIHRoaXMuZm9ybWF0Lm1ham9yTGFiZWxzKHQsdGhpcy5zY2FsZSx0aGlzLnN0ZXApO3ZhciBlPXRoaXMuZm9ybWF0Lm1ham9yTGFiZWxzW3RoaXMuc2NhbGVdO3JldHVybiBlJiZlLmxlbmd0aD4wP3RoaXMubW9tZW50KHQpLmZvcm1hdChlKToiIn0sby5wcm90b3R5cGUuZ2V0Q2xhc3NOYW1lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdC9hJTI9PTA/IiB2aXMtZXZlbiI6IiB2aXMtb2RkIn1mdW5jdGlvbiBlKHQpe3JldHVybiB0LmlzU2FtZShuZXcgRGF0ZSwiZGF5Iik/IiB2aXMtdG9kYXkiOnQuaXNTYW1lKG4oKS5hZGQoMSwiZGF5IiksImRheSIpPyIgdmlzLXRvbW9ycm93Ijp0LmlzU2FtZShuKCkuYWRkKC0xLCJkYXkiKSwiZGF5Iik/IiB2aXMteWVzdGVyZGF5IjoiIn1mdW5jdGlvbiBpKHQpe3JldHVybiB0LmlzU2FtZShuZXcgRGF0ZSwid2VlayIpPyIgdmlzLWN1cnJlbnQtd2VlayI6IiJ9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdC5pc1NhbWUobmV3IERhdGUsIm1vbnRoIik/IiB2aXMtY3VycmVudC1tb250aCI6IiJ9dmFyIG49dGhpcy5tb21lbnQscz10aGlzLm1vbWVudCh0aGlzLmN1cnJlbnQpLHI9cy5sb2NhbGU/cy5sb2NhbGUoImVuIik6cy5sYW5nKCJlbiIpLGE9dGhpcy5zdGVwLGg9W107c3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2UibWlsbGlzZWNvbmQiOmgucHVzaChlKHIpKSxoLnB1c2godChyLm1pbGxpc2Vjb25kcygpKSk7YnJlYWs7Y2FzZSJzZWNvbmQiOmgucHVzaChlKHIpKSxoLnB1c2godChyLnNlY29uZHMoKSkpO2JyZWFrO2Nhc2UibWludXRlIjpoLnB1c2goZShyKSksaC5wdXNoKHQoci5taW51dGVzKCkpKTticmVhaztjYXNlImhvdXIiOmgucHVzaCgidmlzLWgiK3IuaG91cnMoKSt0aGlzLnN0ZXA9PTQ/Ii1oIisoci5ob3VycygpKzQpOiIiKSxoLnB1c2goZShyKSksaC5wdXNoKHQoci5ob3VycygpKSk7YnJlYWs7Y2FzZSJ3ZWVrZGF5IjpoLnB1c2goInZpcy0iK3IuZm9ybWF0KCJkZGRkIikudG9Mb3dlckNhc2UoKSksaC5wdXNoKGUocikpLGgucHVzaChpKHIpKSxoLnB1c2godChyLmRhdGUoKSkpO2JyZWFrO2Nhc2UiZGF5IjpoLnB1c2goInZpcy1kYXkiK3IuZGF0ZSgpKSxoLnB1c2goInZpcy0iK3IuZm9ybWF0KCJNTU1NIikudG9Mb3dlckNhc2UoKSksaC5wdXNoKGUocikpLGgucHVzaChvKHIpKSxoLnB1c2godGhpcy5zdGVwPD0yP2Uocik6IiIpLApoLnB1c2godGhpcy5zdGVwPD0yPyJ2aXMtIityLmZvcm1hdCgiZGRkZCIpLnRvTG93ZXJDYXNlKCk6IiIpLGgucHVzaCh0KHIuZGF0ZSgpLTEpKTticmVhaztjYXNlIndlZWsiOmgucHVzaCgidmlzLXdlZWsiK3IuZm9ybWF0KCJ3IikpLGgucHVzaChpKHIpKSxoLnB1c2godChyLndlZWsoKSkpO2JyZWFrO2Nhc2UibW9udGgiOmgucHVzaCgidmlzLSIrci5mb3JtYXQoIk1NTU0iKS50b0xvd2VyQ2FzZSgpKSxoLnB1c2gobyhyKSksaC5wdXNoKHQoci5tb250aCgpKSk7YnJlYWs7Y2FzZSJ5ZWFyIjpoLnB1c2goInZpcy15ZWFyIityLnllYXIoKSksaC5wdXNoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmlzU2FtZShuZXcgRGF0ZSwieWVhciIpPyIgdmlzLWN1cnJlbnQteWVhciI6IiJ9KHIpKSxoLnB1c2godChyLnllYXIoKSkpfXJldHVybiBoLmZpbHRlcihTdHJpbmcpLmpvaW4oIiAiKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXt0aGlzLmdyb3VwSWQ9dCx0aGlzLnN1Ymdyb3Vwcz17fSx0aGlzLnN1Ymdyb3VwSW5kZXg9MCx0aGlzLnN1Ymdyb3VwT3JkZXJlcj1lJiZlLnN1Ymdyb3VwT3JkZXIsdGhpcy5pdGVtU2V0PWksdGhpcy5pc1Zpc2libGU9bnVsbCx0aGlzLnN0YWNrRGlydHk9ITAsZSYmZS5uZXN0ZWRHcm91cHMmJih0aGlzLm5lc3RlZEdyb3Vwcz1lLm5lc3RlZEdyb3VwcywwPT1lLnNob3dOZXN0ZWQ/dGhpcy5zaG93TmVzdGVkPSExOnRoaXMuc2hvd05lc3RlZD0hMCksdGhpcy5uZXN0ZWRJbkdyb3VwPW51bGwsdGhpcy5kb209e30sdGhpcy5wcm9wcz17bGFiZWw6e3dpZHRoOjAsaGVpZ2h0OjB9fSx0aGlzLmNsYXNzTmFtZT1udWxsLHRoaXMuaXRlbXM9e30sdGhpcy52aXNpYmxlSXRlbXM9W10sdGhpcy5pdGVtc0luUmFuZ2U9W10sdGhpcy5vcmRlcmVkSXRlbXM9e2J5U3RhcnQ6W10sYnlFbmQ6W119LHRoaXMuY2hlY2tSYW5nZWRJdGVtcz0hMTt2YXIgbz10aGlzO3RoaXMuaXRlbVNldC5ib2R5LmVtaXR0ZXIub24oImNoZWNrUmFuZ2VkSXRlbXMiLGZ1bmN0aW9uKCl7by5jaGVja1JhbmdlZEl0ZW1zPSEwfSksdGhpcy5fY3JlYXRlKCksdGhpcy5zZXREYXRhKGUpfXZhciBuPWkoNTgpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMSksYT1pKDEyNik7aSgxMjcpO28ucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLml0ZW1TZXQub3B0aW9ucy5ncm91cEVkaXRhYmxlLm9yZGVyP3QuY2xhc3NOYW1lPSJ2aXMtbGFiZWwgZHJhZ2dhYmxlIjp0LmNsYXNzTmFtZT0idmlzLWxhYmVsIix0aGlzLmRvbS5sYWJlbD10O3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NOYW1lPSJ2aXMtaW5uZXIiLHQuYXBwZW5kQ2hpbGQoZSksdGhpcy5kb20uaW5uZXI9ZTt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLmNsYXNzTmFtZT0idmlzLWdyb3VwIixpWyJ0aW1lbGluZS1ncm91cCJdPXRoaXMsdGhpcy5kb20uZm9yZWdyb3VuZD1pLHRoaXMuZG9tLmJhY2tncm91bmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uYmFja2dyb3VuZC5jbGFzc05hbWU9InZpcy1ncm91cCIsdGhpcy5kb20uYXhpcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5heGlzLmNsYXNzTmFtZT0idmlzLWdyb3VwIix0aGlzLmRvbS5tYXJrZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20ubWFya2VyLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsdGhpcy5kb20ubWFya2VyLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5kb20ubWFya2VyLmlubmVySFRNTD0iIix0aGlzLmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKHRoaXMuZG9tLm1hcmtlcil9LG8ucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dmFyIGUsaTtpZih0aGlzLml0ZW1TZXQub3B0aW9ucyYmdGhpcy5pdGVtU2V0Lm9wdGlvbnMuZ3JvdXBUZW1wbGF0ZT8oaT10aGlzLml0ZW1TZXQub3B0aW9ucy5ncm91cFRlbXBsYXRlLmJpbmQodGhpcyksZT1pKHQsdGhpcy5kb20uaW5uZXIpKTplPXQmJnQuY29udGVudCxlIGluc3RhbmNlb2YgRWxlbWVudCl7Zm9yKHRoaXMuZG9tLmlubmVyLmFwcGVuZENoaWxkKGUpO3RoaXMuZG9tLmlubmVyLmZpcnN0Q2hpbGQ7KXRoaXMuZG9tLmlubmVyLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmlubmVyLmZpcnN0Q2hpbGQpO3RoaXMuZG9tLmlubmVyLmFwcGVuZENoaWxkKGUpfWVsc2UgZSBpbnN0YW5jZW9mIE9iamVjdD9pKHQsdGhpcy5kb20uaW5uZXIpOnRoaXMuZG9tLmlubmVyLmlubmVySFRNTD12b2lkIDAhPT1lJiZudWxsIT09ZT9lOnRoaXMuZ3JvdXBJZHx8IiI7aWYodGhpcy5kb20ubGFiZWwudGl0bGU9dCYmdC50aXRsZXx8IiIsdGhpcy5kb20uaW5uZXIuZmlyc3RDaGlsZD9yLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5pbm5lciwidmlzLWhpZGRlbiIpOnIuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmlubmVyLCJ2aXMtaGlkZGVuIiksdCYmdC5uZXN0ZWRHcm91cHMpe3RoaXMubmVzdGVkR3JvdXBzJiZ0aGlzLm5lc3RlZEdyb3Vwcz09dC5uZXN0ZWRHcm91cHN8fCh0aGlzLm5lc3RlZEdyb3Vwcz10Lm5lc3RlZEdyb3Vwcyksdm9pZCAwPT09dC5zaG93TmVzdGVkJiZ2b2lkIDAhPT10aGlzLnNob3dOZXN0ZWR8fCgwPT10LnNob3dOZXN0ZWQ/dGhpcy5zaG93TmVzdGVkPSExOnRoaXMuc2hvd05lc3RlZD0hMCksci5hZGRDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsInZpcy1uZXN0aW5nLWdyb3VwIik7dmFyIG89dGhpcy5pdGVtU2V0Lm9wdGlvbnMucnRsPyJjb2xsYXBzZWQtcnRsIjoiY29sbGFwc2VkIjt0aGlzLnNob3dOZXN0ZWQ/KHIucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLG8pLHIuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLCJleHBhbmRlZCIpKTooci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsImV4cGFuZGVkIiksci5hZGRDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsbykpfWVsc2UgaWYodGhpcy5uZXN0ZWRHcm91cHMpe3RoaXMubmVzdGVkR3JvdXBzPW51bGw7dmFyIG89dGhpcy5pdGVtU2V0Lm9wdGlvbnMucnRsPyJjb2xsYXBzZWQtcnRsIjoiY29sbGFwc2VkIjtyLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCxvKSxyLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCwiZXhwYW5kZWQiKSxyLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCwidmlzLW5lc3RpbmctZ3JvdXAiKX10JiZ0Lm5lc3RlZEluR3JvdXAmJihyLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCwidmlzLW5lc3RlZC1ncm91cCIpLHRoaXMuaXRlbVNldC5vcHRpb25zJiZ0aGlzLml0ZW1TZXQub3B0aW9ucy5ydGw/dGhpcy5kb20uaW5uZXIuc3R5bGUucGFkZGluZ1JpZ2h0PSIzMHB4Ijp0aGlzLmRvbS5pbm5lci5zdHlsZS5wYWRkaW5nTGVmdD0iMzBweCIpO3ZhciBuPXQmJnQuY2xhc3NOYW1lfHxudWxsO24hPXRoaXMuY2xhc3NOYW1lJiYodGhpcy5jbGFzc05hbWUmJihyLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCx0aGlzLmNsYXNzTmFtZSksci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20uZm9yZWdyb3VuZCx0aGlzLmNsYXNzTmFtZSksci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20uYmFja2dyb3VuZCx0aGlzLmNsYXNzTmFtZSksci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20uYXhpcyx0aGlzLmNsYXNzTmFtZSkpLHIuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLG4pLHIuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmZvcmVncm91bmQsbiksci5hZGRDbGFzc05hbWUodGhpcy5kb20uYmFja2dyb3VuZCxuKSxyLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5heGlzLG4pLHRoaXMuY2xhc3NOYW1lPW4pLHRoaXMuc3R5bGUmJihyLnJlbW92ZUNzc1RleHQodGhpcy5kb20ubGFiZWwsdGhpcy5zdHlsZSksdGhpcy5zdHlsZT1udWxsKSx0JiZ0LnN0eWxlJiYoci5hZGRDc3NUZXh0KHRoaXMuZG9tLmxhYmVsLHQuc3R5bGUpLHRoaXMuc3R5bGU9dC5zdHlsZSl9LG8ucHJvdG90eXBlLmdldExhYmVsV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wcy5sYWJlbC53aWR0aH0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKHQsZSxpKXt2YXIgbz0hMSxuPXRoaXMuZG9tLm1hcmtlci5jbGllbnRIZWlnaHQ7biE9dGhpcy5sYXN0TWFya2VySGVpZ2h0JiYodGhpcy5sYXN0TWFya2VySGVpZ2h0PW4sci5mb3JFYWNoKHRoaXMuaXRlbXMsZnVuY3Rpb24odCl7dC5kaXJ0eT0hMCx0LmRpc3BsYXllZCYmdC5yZWRyYXcoKX0pLGk9ITApLHRoaXMuX2NhbGN1bGF0ZVN1Ykdyb3VwSGVpZ2h0cyhlKTt2YXIgcz10aGlzLmRvbS5mb3JlZ3JvdW5kO3RoaXMudG9wPXMub2Zmc2V0VG9wLHRoaXMucmlnaHQ9cy5vZmZzZXRMZWZ0LHRoaXMud2lkdGg9cy5vZmZzZXRXaWR0aDt2YXIgaD10aGlzLmlzVmlzaWJsZTtpZih0aGlzLmlzVmlzaWJsZT10aGlzLl9pc0dyb3VwVmlzaWJsZSh0LGUpLGl8fHRoaXMuc3RhY2tEaXJ0eXx8dGhpcy5pc1Zpc2libGUmJiFoKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pdGVtU2V0Lm9wdGlvbnMub3JkZXIpe3ZhciBkPXRoaXM7ci5mb3JFYWNoKHRoaXMuaXRlbXMsZnVuY3Rpb24odCl7dC5kaXNwbGF5ZWR8fCh0LnJlZHJhdygpLGQudmlzaWJsZUl0ZW1zLnB1c2godCkpLHQucmVwb3NpdGlvblgoITEpfSk7dmFyIGw9dGhpcy5vcmRlcmVkSXRlbXMuYnlTdGFydC5zbGljZSgpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gZC5pdGVtU2V0Lm9wdGlvbnMub3JkZXIodC5kYXRhLGUuZGF0YSl9KTthLnN0YWNrKGwsZSwhMCksdGhpcy52aXNpYmxlSXRlbXM9dGhpcy5fdXBkYXRlSXRlbXNJblJhbmdlKHRoaXMub3JkZXJlZEl0ZW1zLHRoaXMudmlzaWJsZUl0ZW1zLHQpfWVsc2UgdGhpcy52aXNpYmxlSXRlbXM9dGhpcy5fdXBkYXRlSXRlbXNJblJhbmdlKHRoaXMub3JkZXJlZEl0ZW1zLHRoaXMudmlzaWJsZUl0ZW1zLHQpLHRoaXMuaXRlbVNldC5vcHRpb25zLnN0YWNrP2Euc3RhY2sodGhpcy52aXNpYmxlSXRlbXMsZSwhMCk6YS5ub3N0YWNrKHRoaXMudmlzaWJsZUl0ZW1zLGUsdGhpcy5zdWJncm91cHMsdGhpcy5pdGVtU2V0Lm9wdGlvbnMuc3RhY2tTdWJncm91cHMpO3RoaXMuc3RhY2tEaXJ0eT0hMX10aGlzLl91cGRhdGVTdWJncm91cHNTaXplcygpO3ZhciB1PXRoaXMuX2NhbGN1bGF0ZUhlaWdodChlKSxzPXRoaXMuZG9tLmZvcmVncm91bmQ7dGhpcy50b3A9cy5vZmZzZXRUb3AsdGhpcy5yaWdodD1zLm9mZnNldExlZnQsdGhpcy53aWR0aD1zLm9mZnNldFdpZHRoLG89ci51cGRhdGVQcm9wZXJ0eSh0aGlzLCJoZWlnaHQiLHUpfHxvLG89ci51cGRhdGVQcm9wZXJ0eSh0aGlzLnByb3BzLmxhYmVsLCJ3aWR0aCIsdGhpcy5kb20uaW5uZXIuY2xpZW50V2lkdGgpfHxvLG89ci51cGRhdGVQcm9wZXJ0eSh0aGlzLnByb3BzLmxhYmVsLCJoZWlnaHQiLHRoaXMuZG9tLmlubmVyLmNsaWVudEhlaWdodCl8fG8sdGhpcy5kb20uYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQ9dSsicHgiLHRoaXMuZG9tLmZvcmVncm91bmQuc3R5bGUuaGVpZ2h0PXUrInB4Iix0aGlzLmRvbS5sYWJlbC5zdHlsZS5oZWlnaHQ9dSsicHgiO2Zvcih2YXIgYz0wLHA9dGhpcy52aXNpYmxlSXRlbXMubGVuZ3RoO2M8cDtjKyspe3ZhciBmPXRoaXMudmlzaWJsZUl0ZW1zW2NdO2YucmVwb3NpdGlvblkoZSksdGhpcy5pc1Zpc2libGV8fCJfX2JhY2tncm91bmRfXyI9PXRoaXMuZ3JvdXBJZHx8Zi5kaXNwbGF5ZWQmJmYuaGlkZSgpfXJldHVybiF0aGlzLmlzVmlzaWJsZSYmdGhpcy5oZWlnaHQ/bz0hMTpvfSxvLnByb3RvdHlwZS5fY2FsY3VsYXRlU3ViR3JvdXBIZWlnaHRzPWZ1bmN0aW9uKHQpe2lmKCgwLHMuZGVmYXVsdCkodGhpcy5zdWJncm91cHMpLmxlbmd0aD4wKXt2YXIgZT10aGlzO3RoaXMucmVzZXRTdWJncm91cHMoKSxyLmZvckVhY2godGhpcy52aXNpYmxlSXRlbXMsZnVuY3Rpb24oaSl7dm9pZCAwIT09aS5kYXRhLnN1Ymdyb3VwJiYoZS5zdWJncm91cHNbaS5kYXRhLnN1Ymdyb3VwXS5oZWlnaHQ9TWF0aC5tYXgoZS5zdWJncm91cHNbaS5kYXRhLnN1Ymdyb3VwXS5oZWlnaHQsaS5oZWlnaHQrdC5pdGVtLnZlcnRpY2FsKSxlLnN1Ymdyb3Vwc1tpLmRhdGEuc3ViZ3JvdXBdLnZpc2libGU9ITApfSl9fSxvLnByb3RvdHlwZS5faXNHcm91cFZpc2libGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50b3A8PXQuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0LXQuYm9keS5kb21Qcm9wcy5zY3JvbGxUb3ArZS5heGlzJiZ0aGlzLnRvcCt0aGlzLmhlaWdodCtlLmF4aXM+PS10LmJvZHkuZG9tUHJvcHMuc2Nyb2xsVG9wfSxvLnByb3RvdHlwZS5fY2FsY3VsYXRlSGVpZ2h0PWZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcy52aXNpYmxlSXRlbXM7aWYoaS5sZW5ndGg+MCl7dmFyIG89aVswXS50b3Asbj1pWzBdLnRvcCtpWzBdLmhlaWdodDtpZihyLmZvckVhY2goaSxmdW5jdGlvbih0KXtvPU1hdGgubWluKG8sdC50b3ApLG49TWF0aC5tYXgobix0LnRvcCt0LmhlaWdodCl9KSxvPnQuYXhpcyl7dmFyIHM9by10LmF4aXM7bi09cyxyLmZvckVhY2goaSxmdW5jdGlvbih0KXt0LnRvcC09c30pfWU9bit0Lml0ZW0udmVydGljYWwvMn1lbHNlIGU9MDtyZXR1cm4gZT1NYXRoLm1heChlLHRoaXMucHJvcHMubGFiZWwuaGVpZ2h0KX0sby5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuZG9tLmxhYmVsLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20ubGFiZWxTZXQuYXBwZW5kQ2hpbGQodGhpcy5kb20ubGFiZWwpLHRoaXMuZG9tLmZvcmVncm91bmQucGFyZW50Tm9kZXx8dGhpcy5pdGVtU2V0LmRvbS5mb3JlZ3JvdW5kLmFwcGVuZENoaWxkKHRoaXMuZG9tLmZvcmVncm91bmQpLHRoaXMuZG9tLmJhY2tncm91bmQucGFyZW50Tm9kZXx8dGhpcy5pdGVtU2V0LmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKHRoaXMuZG9tLmJhY2tncm91bmQpLHRoaXMuZG9tLmF4aXMucGFyZW50Tm9kZXx8dGhpcy5pdGVtU2V0LmRvbS5heGlzLmFwcGVuZENoaWxkKHRoaXMuZG9tLmF4aXMpfSxvLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kb20ubGFiZWw7dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCk7dmFyIGU9dGhpcy5kb20uZm9yZWdyb3VuZDtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTt2YXIgaT10aGlzLmRvbS5iYWNrZ3JvdW5kO2kucGFyZW50Tm9kZSYmaS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpO3ZhciBvPXRoaXMuZG9tLmF4aXM7by5wYXJlbnROb2RlJiZvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyl9LG8ucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZih0aGlzLml0ZW1zW3QuaWRdPXQsdC5zZXRQYXJlbnQodGhpcyksdGhpcy5zdGFja0RpcnR5PSEwLHZvaWQgMCE9PXQuZGF0YS5zdWJncm91cCYmKHRoaXMuX2FkZFRvU3ViZ3JvdXAodCksdGhpcy5vcmRlclN1Ymdyb3VwcygpKSwtMT09dGhpcy52aXNpYmxlSXRlbXMuaW5kZXhPZih0KSl7dmFyIGU9dGhpcy5pdGVtU2V0LmJvZHkucmFuZ2U7dGhpcy5fY2hlY2tJZlZpc2libGUodCx0aGlzLnZpc2libGVJdGVtcyxlKX19LG8ucHJvdG90eXBlLl9hZGRUb1N1Ymdyb3VwPWZ1bmN0aW9uKHQsZSl7ZT1lfHx0LmRhdGEuc3ViZ3JvdXAsdm9pZCAwIT1lJiZ2b2lkIDA9PT10aGlzLnN1Ymdyb3Vwc1tlXSYmKHRoaXMuc3ViZ3JvdXBzW2VdPXtoZWlnaHQ6MCx0b3A6MCxzdGFydDp0LmRhdGEuc3RhcnQsZW5kOnQuZGF0YS5lbmQsdmlzaWJsZTohMSxpbmRleDp0aGlzLnN1Ymdyb3VwSW5kZXgsaXRlbXM6W119LHRoaXMuc3ViZ3JvdXBJbmRleCsrKSxuZXcgRGF0ZSh0LmRhdGEuc3RhcnQpPG5ldyBEYXRlKHRoaXMuc3ViZ3JvdXBzW2VdLnN0YXJ0KSYmKHRoaXMuc3ViZ3JvdXBzW2VdLnN0YXJ0PXQuZGF0YS5zdGFydCksbmV3IERhdGUodC5kYXRhLmVuZCk+bmV3IERhdGUodGhpcy5zdWJncm91cHNbZV0uZW5kKSYmKHRoaXMuc3ViZ3JvdXBzW2VdLmVuZD10LmRhdGEuZW5kKSx0aGlzLnN1Ymdyb3Vwc1tlXS5pdGVtcy5wdXNoKHQpfSxvLnByb3RvdHlwZS5fdXBkYXRlU3ViZ3JvdXBzU2l6ZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHQuc3ViZ3JvdXBzKWZvcih2YXIgZSBpbiB0LnN1Ymdyb3Vwcyl7dmFyIGk9dC5zdWJncm91cHNbZV0uaXRlbXNbMF0uZGF0YS5zdGFydCxvPXQuc3ViZ3JvdXBzW2VdLml0ZW1zWzBdLmRhdGEuZW5kO3Quc3ViZ3JvdXBzW2VdLml0ZW1zLmZvckVhY2goZnVuY3Rpb24odCl7bmV3IERhdGUodC5kYXRhLnN0YXJ0KTxuZXcgRGF0ZShpKSYmKGk9dC5kYXRhLnN0YXJ0KSxuZXcgRGF0ZSh0LmRhdGEuZW5kKT5uZXcgRGF0ZShvKSYmKG89dC5kYXRhLmVuZCl9KSx0LnN1Ymdyb3Vwc1tlXS5zdGFydD1pLHQuc3ViZ3JvdXBzW2VdLmVuZD1vfX0sby5wcm90b3R5cGUub3JkZXJTdWJncm91cHM9ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT10aGlzLnN1Ymdyb3VwT3JkZXJlcil7dmFyIHQ9W107aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnN1Ymdyb3VwT3JkZXJlcil7Zm9yKHZhciBlIGluIHRoaXMuc3ViZ3JvdXBzKXQucHVzaCh7c3ViZ3JvdXA6ZSxzb3J0RmllbGQ6dGhpcy5zdWJncm91cHNbZV0uaXRlbXNbMF0uZGF0YVt0aGlzLnN1Ymdyb3VwT3JkZXJlcl19KTt0LnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zb3J0RmllbGQtZS5zb3J0RmllbGR9KX1lbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnN1Ymdyb3VwT3JkZXJlcil7Zm9yKHZhciBlIGluIHRoaXMuc3ViZ3JvdXBzKXQucHVzaCh0aGlzLnN1Ymdyb3Vwc1tlXS5pdGVtc1swXS5kYXRhKTt0LnNvcnQodGhpcy5zdWJncm91cE9yZGVyZXIpfWlmKHQubGVuZ3RoPjApZm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspdGhpcy5zdWJncm91cHNbdFtpXS5zdWJncm91cF0uaW5kZXg9aX19LG8ucHJvdG90eXBlLnJlc2V0U3ViZ3JvdXBzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuc3ViZ3JvdXBzKXRoaXMuc3ViZ3JvdXBzLmhhc093blByb3BlcnR5KHQpJiYodGhpcy5zdWJncm91cHNbdF0udmlzaWJsZT0hMSx0aGlzLnN1Ymdyb3Vwc1t0XS5oZWlnaHQ9MCl9LG8ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtkZWxldGUgdGhpcy5pdGVtc1t0LmlkXSx0LnNldFBhcmVudChudWxsKSx0aGlzLnN0YWNrRGlydHk9ITA7dmFyIGU9dGhpcy52aXNpYmxlSXRlbXMuaW5kZXhPZih0KTstMSE9ZSYmdGhpcy52aXNpYmxlSXRlbXMuc3BsaWNlKGUsMSksdm9pZCAwIT09dC5kYXRhLnN1Ymdyb3VwJiYodGhpcy5fcmVtb3ZlRnJvbVN1Ymdyb3VwKHQpLHRoaXMub3JkZXJTdWJncm91cHMoKSl9LG8ucHJvdG90eXBlLl9yZW1vdmVGcm9tU3ViZ3JvdXA9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPShlPWV8fHQuZGF0YS5zdWJncm91cCkpe3ZhciBpPXRoaXMuc3ViZ3JvdXBzW2VdO2lmKGkpe3ZhciBvPWkuaXRlbXMuaW5kZXhPZih0KTtvPj0wJiYoaS5pdGVtcy5zcGxpY2UobywxKSxpLml0ZW1zLmxlbmd0aD90aGlzLl91cGRhdGVTdWJncm91cHNTaXplcygpOmRlbGV0ZSB0aGlzLnN1Ymdyb3Vwc1tlXSl9fX0sby5wcm90b3R5cGUucmVtb3ZlRnJvbURhdGFTZXQ9ZnVuY3Rpb24odCl7dGhpcy5pdGVtU2V0LnJlbW92ZUl0ZW0odC5pZCl9LG8ucHJvdG90eXBlLm9yZGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXIudG9BcnJheSh0aGlzLml0ZW1zKSxlPVtdLGk9W10sbz0wO288dC5sZW5ndGg7bysrKXZvaWQgMCE9PXRbb10uZGF0YS5lbmQmJmkucHVzaCh0W29dKSxlLnB1c2godFtvXSk7dGhpcy5vcmRlcmVkSXRlbXM9e2J5U3RhcnQ6ZSxieUVuZDppfSxhLm9yZGVyQnlTdGFydCh0aGlzLm9yZGVyZWRJdGVtcy5ieVN0YXJ0KSxhLm9yZGVyQnlFbmQodGhpcy5vcmRlcmVkSXRlbXMuYnlFbmQpfSxvLnByb3RvdHlwZS5fdXBkYXRlSXRlbXNJblJhbmdlPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1bXSxuPXt9LHM9KGkuZW5kLWkuc3RhcnQpLzQsYT1pLnN0YXJ0LXMsaD1pLmVuZCtzLGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ8YT8tMTp0PD1oPzA6MX07aWYoZS5sZW5ndGg+MClmb3IodmFyIGw9MDtsPGUubGVuZ3RoO2wrKyl0aGlzLl9jaGVja0lmVmlzaWJsZVdpdGhSZWZlcmVuY2UoZVtsXSxvLG4saSk7dmFyIHU9ci5iaW5hcnlTZWFyY2hDdXN0b20odC5ieVN0YXJ0LGQsImRhdGEiLCJzdGFydCIpO2lmKHRoaXMuX3RyYWNlVmlzaWJsZSh1LHQuYnlTdGFydCxvLG4sZnVuY3Rpb24odCl7cmV0dXJuIHQuZGF0YS5zdGFydDxhfHx0LmRhdGEuc3RhcnQ+aH0pLDE9PXRoaXMuY2hlY2tSYW5nZWRJdGVtcylmb3IodGhpcy5jaGVja1JhbmdlZEl0ZW1zPSExLGw9MDtsPHQuYnlFbmQubGVuZ3RoO2wrKyl0aGlzLl9jaGVja0lmVmlzaWJsZVdpdGhSZWZlcmVuY2UodC5ieUVuZFtsXSxvLG4saSk7ZWxzZXt2YXIgYz1yLmJpbmFyeVNlYXJjaEN1c3RvbSh0LmJ5RW5kLGQsImRhdGEiLCJlbmQiKTt0aGlzLl90cmFjZVZpc2libGUoYyx0LmJ5RW5kLG8sbixmdW5jdGlvbih0KXtyZXR1cm4gdC5kYXRhLmVuZDxhfHx0LmRhdGEuZW5kPmh9KX1mb3IodmFyIGw9MDtsPG8ubGVuZ3RoO2wrKyl7dmFyIHA9b1tsXTtwLmRpc3BsYXllZHx8cC5zaG93KCkscC5yZXBvc2l0aW9uWCgpfXJldHVybiBvfSxvLnByb3RvdHlwZS5fdHJhY2VWaXNpYmxlPWZ1bmN0aW9uKHQsZSxpLG8sbil7aWYoLTEhPXQpe2Zvcih2YXIgcz10O3M+PTA7cy0tKXt2YXIgcj1lW3NdO2lmKG4ocikpYnJlYWs7dm9pZCAwPT09b1tyLmlkXSYmKG9bci5pZF09ITAsaS5wdXNoKHIpKX1mb3IodmFyIHM9dCsxO3M8ZS5sZW5ndGg7cysrKXt2YXIgcj1lW3NdO2lmKG4ocikpYnJlYWs7dm9pZCAwPT09b1tyLmlkXSYmKG9bci5pZF09ITAsaS5wdXNoKHIpKX19fSxvLnByb3RvdHlwZS5fY2hlY2tJZlZpc2libGU9ZnVuY3Rpb24odCxlLGkpe3QuaXNWaXNpYmxlKGkpPyh0LmRpc3BsYXllZHx8dC5zaG93KCksdC5yZXBvc2l0aW9uWCgpLGUucHVzaCh0KSk6dC5kaXNwbGF5ZWQmJnQuaGlkZSgpfSxvLnByb3RvdHlwZS5fY2hlY2tJZlZpc2libGVXaXRoUmVmZXJlbmNlPWZ1bmN0aW9uKHQsZSxpLG8pe3QuaXNWaXNpYmxlKG8pP3ZvaWQgMD09PWlbdC5pZF0mJihpW3QuaWRdPSEwLGUucHVzaCh0KSk6dC5kaXNwbGF5ZWQmJnQuaGlkZSgpfSxvLnByb3RvdHlwZS5jaGFuZ2VTdWJncm91cD1mdW5jdGlvbih0LGUsaSl7dGhpcy5fcmVtb3ZlRnJvbVN1Ymdyb3VwKHQsZSksdGhpcy5fYWRkVG9TdWJncm91cCh0LGkpLHRoaXMub3JkZXJTdWJncm91cHMoKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSl7ZS5vcmRlckJ5U3RhcnQ9ZnVuY3Rpb24odCl7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZGF0YS5zdGFydC1lLmRhdGEuc3RhcnR9KX0sZS5vcmRlckJ5RW5kPWZ1bmN0aW9uKHQpe3Quc29ydChmdW5jdGlvbih0LGUpe3JldHVybigiZW5kImluIHQuZGF0YT90LmRhdGEuZW5kOnQuZGF0YS5zdGFydCktKCJlbmQiaW4gZS5kYXRhP2UuZGF0YS5lbmQ6ZS5kYXRhLnN0YXJ0KX0pfSxlLnN0YWNrPWZ1bmN0aW9uKHQsaSxvKXtpZihvKWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRbbl0udG9wPW51bGw7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl07aWYocy5zdGFjayYmbnVsbD09PXMudG9wKXtzLnRvcD1pLmF4aXM7ZG97Zm9yKHZhciByPW51bGwsYT0wLGg9dC5sZW5ndGg7YTxoO2ErKyl7dmFyIGQ9dFthXTtpZihudWxsIT09ZC50b3AmJmQhPT1zJiZkLnN0YWNrJiZlLmNvbGxpc2lvbihzLGQsaS5pdGVtLGQub3B0aW9ucy5ydGwpKXtyPWQ7YnJlYWt9fW51bGwhPXImJihzLnRvcD1yLnRvcCtyLmhlaWdodCtpLml0ZW0udmVydGljYWwpfXdoaWxlKHIpfX19LGUubm9zdGFjaz1mdW5jdGlvbih0LGksbyxuKXtmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKylpZih2b2lkIDA9PXRbc10uZGF0YS5zdWJncm91cCl0W3NdLnRvcD1pLml0ZW0udmVydGljYWw7ZWxzZSBpZih2b2lkIDAhPT10W3NdLmRhdGEuc3ViZ3JvdXAmJm4pe3ZhciByPTA7Zm9yKHZhciBhIGluIG8pby5oYXNPd25Qcm9wZXJ0eShhKSYmMT09b1thXS52aXNpYmxlJiZvW2FdLmluZGV4PG9bdFtzXS5kYXRhLnN1Ymdyb3VwXS5pbmRleCYmKHIrPW9bYV0uaGVpZ2h0LG9bdFtzXS5kYXRhLnN1Ymdyb3VwXS50b3A9cik7dFtzXS50b3A9cisuNSppLml0ZW0udmVydGljYWx9bnx8ZS5zdGFja1N1Ymdyb3Vwcyh0LGksbyl9LGUuc3RhY2tTdWJncm91cHM9ZnVuY3Rpb24odCxpLG8pe2Zvcih2YXIgbiBpbiBvKWlmKG8uaGFzT3duUHJvcGVydHkobikpe29bbl0udG9wPTA7ZG97dmFyIHM9bnVsbDtmb3IodmFyIHIgaW4gbylpZihudWxsIT09b1tyXS50b3AmJnIhPT1uJiZvW25dLmluZGV4Pm9bcl0uaW5kZXgmJmUuY29sbGlzaW9uQnlUaW1lcyhvW25dLG9bcl0pKXtzPW9bcl07YnJlYWt9bnVsbCE9cyYmKG9bbl0udG9wPXMudG9wK3MuaGVpZ2h0KX13aGlsZShzKX1mb3IodmFyIGE9MDthPHQubGVuZ3RoO2ErKyl2b2lkIDAhPT10W2FdLmRhdGEuc3ViZ3JvdXAmJih0W2FdLnRvcD1vW3RbYV0uZGF0YS5zdWJncm91cF0udG9wKy41KmkuaXRlbS52ZXJ0aWNhbCl9LGUuY29sbGlzaW9uPWZ1bmN0aW9uKHQsZSxpLG8pe3JldHVybiBvP3QucmlnaHQtaS5ob3Jpem9udGFsKy4wMDE8ZS5yaWdodCtlLndpZHRoJiZ0LnJpZ2h0K3Qud2lkdGgraS5ob3Jpem9udGFsLS4wMDE+ZS5yaWdodCYmdC50b3AtaS52ZXJ0aWNhbCsuMDAxPGUudG9wK2UuaGVpZ2h0JiZ0LnRvcCt0LmhlaWdodCtpLnZlcnRpY2FsLS4wMDE+ZS50b3A6dC5sZWZ0LWkuaG9yaXpvbnRhbCsuMDAxPGUubGVmdCtlLndpZHRoJiZ0LmxlZnQrdC53aWR0aCtpLmhvcml6b250YWwtLjAwMT5lLmxlZnQmJnQudG9wLWkudmVydGljYWwrLjAwMTxlLnRvcCtlLmhlaWdodCYmdC50b3ArdC5oZWlnaHQraS52ZXJ0aWNhbC0uMDAxPmUudG9wfSxlLmNvbGxpc2lvbkJ5VGltZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zdGFydDw9ZS5zdGFydCYmdC5lbmQ+PWUuc3RhcnQmJnQudG9wPGUudG9wK2UuaGVpZ2h0JiZ0LnRvcCt0LmhlaWdodD5lLnRvcHx8ZS5zdGFydDw9dC5zdGFydCYmZS5lbmQ+PXQuc3RhcnQmJmUudG9wPHQudG9wK3QuaGVpZ2h0JiZlLnRvcCtlLmhlaWdodD50LnRvcH19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXtpZih0aGlzLnByb3BzPXtjb250ZW50Ont3aWR0aDowfX0sdGhpcy5vdmVyZmxvdz0hMSx0aGlzLm9wdGlvbnM9aSx0KXtpZih2b2lkIDA9PXQuc3RhcnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSAic3RhcnQiIG1pc3NpbmcgaW4gaXRlbSAnK3QuaWQpO2lmKHZvaWQgMD09dC5lbmQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSAiZW5kIiBtaXNzaW5nIGluIGl0ZW0gJyt0LmlkKX1uLmNhbGwodGhpcyx0LGUsaSl9dmFyIG49KGkoMTEyKSxpKDEyOCkpO28ucHJvdG90eXBlPW5ldyBuKG51bGwsbnVsbCxudWxsKSxvLnByb3RvdHlwZS5iYXNlQ2xhc3NOYW1lPSJ2aXMtaXRlbSB2aXMtcmFuZ2UiLG8ucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXRhLnN0YXJ0PHQuZW5kJiZ0aGlzLmRhdGEuZW5kPnQuc3RhcnR9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZG9tO2lmKHR8fCh0aGlzLmRvbT17fSx0PXRoaXMuZG9tLHQuYm94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHQuZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5mcmFtZS5jbGFzc05hbWU9InZpcy1pdGVtLW92ZXJmbG93Iix0LmJveC5hcHBlbmRDaGlsZCh0LmZyYW1lKSx0LnZpc2libGVGcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LnZpc2libGVGcmFtZS5jbGFzc05hbWU9InZpcy1pdGVtLXZpc2libGUtZnJhbWUiLHQuYm94LmFwcGVuZENoaWxkKHQudmlzaWJsZUZyYW1lKSx0LmNvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5jb250ZW50LmNsYXNzTmFtZT0idmlzLWl0ZW0tY29udGVudCIsdC5mcmFtZS5hcHBlbmRDaGlsZCh0LmNvbnRlbnQpLHQuYm94WyJ0aW1lbGluZS1pdGVtIl09dGhpcyx0aGlzLmRpcnR5PSEwKSwhdGhpcy5wYXJlbnQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVkcmF3IGl0ZW06IG5vIHBhcmVudCBhdHRhY2hlZCIpO2lmKCF0LmJveC5wYXJlbnROb2RlKXt2YXIgZT10aGlzLnBhcmVudC5kb20uZm9yZWdyb3VuZDtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBmb3JlZ3JvdW5kIGNvbnRhaW5lciBlbGVtZW50Iik7ZS5hcHBlbmRDaGlsZCh0LmJveCl9aWYodGhpcy5kaXNwbGF5ZWQ9ITAsdGhpcy5kaXJ0eSl7dGhpcy5fdXBkYXRlQ29udGVudHModGhpcy5kb20uY29udGVudCksdGhpcy5fdXBkYXRlRGF0YUF0dHJpYnV0ZXModGhpcy5kb20uYm94KSx0aGlzLl91cGRhdGVTdHlsZSh0aGlzLmRvbS5ib3gpO3ZhciBpPXRoaXMuZWRpdGFibGUudXBkYXRlVGltZXx8dGhpcy5lZGl0YWJsZS51cGRhdGVHcm91cCxvPSh0aGlzLmRhdGEuY2xhc3NOYW1lPyIgIit0aGlzLmRhdGEuY2xhc3NOYW1lOiIiKSsodGhpcy5zZWxlY3RlZD8iIHZpcy1zZWxlY3RlZCI6IiIpKyhpPyIgdmlzLWVkaXRhYmxlIjoiIHZpcy1yZWFkb25seSIpO3QuYm94LmNsYXNzTmFtZT10aGlzLmJhc2VDbGFzc05hbWUrbyx0aGlzLm92ZXJmbG93PSJoaWRkZW4iIT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodC5mcmFtZSkub3ZlcmZsb3csdGhpcy5kb20uY29udGVudC5zdHlsZS5tYXhXaWR0aD0ibm9uZSIsdGhpcy5wcm9wcy5jb250ZW50LndpZHRoPXRoaXMuZG9tLmNvbnRlbnQub2Zmc2V0V2lkdGgsdGhpcy5oZWlnaHQ9dGhpcy5kb20uYm94Lm9mZnNldEhlaWdodCx0aGlzLmRvbS5jb250ZW50LnN0eWxlLm1heFdpZHRoPSIiLHRoaXMuZGlydHk9ITF9dGhpcy5fcmVwYWludE9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwKHQuYm94KSx0aGlzLl9yZXBhaW50RGVsZXRlQnV0dG9uKHQuYm94KSx0aGlzLl9yZXBhaW50RHJhZ0NlbnRlcigpLHRoaXMuX3JlcGFpbnREcmFnTGVmdCgpLHRoaXMuX3JlcGFpbnREcmFnUmlnaHQoKX0sby5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuZGlzcGxheWVkfHx0aGlzLnJlZHJhdygpfSxvLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7aWYodGhpcy5kaXNwbGF5ZWQpe3ZhciB0PXRoaXMuZG9tLmJveDt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0aGlzLmRpc3BsYXllZD0hMX19LG8ucHJvdG90eXBlLnJlcG9zaXRpb25YPWZ1bmN0aW9uKHQpe3ZhciBlLGksbz10aGlzLnBhcmVudC53aWR0aCxuPXRoaXMuY29udmVyc2lvbi50b1NjcmVlbih0aGlzLmRhdGEuc3RhcnQpLHM9dGhpcy5jb252ZXJzaW9uLnRvU2NyZWVuKHRoaXMuZGF0YS5lbmQpO3ZvaWQgMCE9PXQmJiEwIT09dHx8KG48LW8mJihuPS1vKSxzPjIqbyYmKHM9MipvKSk7dmFyIHI9TWF0aC5tYXgocy1uKy41LDEpO3N3aXRjaCh0aGlzLm92ZXJmbG93Pyh0aGlzLm9wdGlvbnMucnRsP3RoaXMucmlnaHQ9bjp0aGlzLmxlZnQ9bix0aGlzLndpZHRoPXIrdGhpcy5wcm9wcy5jb250ZW50LndpZHRoLGk9dGhpcy5wcm9wcy5jb250ZW50LndpZHRoKToodGhpcy5vcHRpb25zLnJ0bD90aGlzLnJpZ2h0PW46dGhpcy5sZWZ0PW4sdGhpcy53aWR0aD1yLGk9TWF0aC5taW4ocy1uLHRoaXMucHJvcHMuY29udGVudC53aWR0aCkpLHRoaXMub3B0aW9ucy5ydGw/dGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0PXRoaXMucmlnaHQrInB4Ijp0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10aGlzLmxlZnQrInB4Iix0aGlzLmRvbS5ib3guc3R5bGUud2lkdGg9cisicHgiLHRoaXMub3B0aW9ucy5hbGlnbil7Y2FzZSJsZWZ0Ijp0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLmNvbnRlbnQuc3R5bGUucmlnaHQ9IjAiOnRoaXMuZG9tLmNvbnRlbnQuc3R5bGUubGVmdD0iMCI7YnJlYWs7Y2FzZSJyaWdodCI6dGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0PU1hdGgubWF4KHItaSwwKSsicHgiOnRoaXMuZG9tLmNvbnRlbnQuc3R5bGUubGVmdD1NYXRoLm1heChyLWksMCkrInB4IjticmVhaztjYXNlImNlbnRlciI6dGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0PU1hdGgubWF4KChyLWkpLzIsMCkrInB4Ijp0aGlzLmRvbS5jb250ZW50LnN0eWxlLmxlZnQ9TWF0aC5tYXgoKHItaSkvMiwwKSsicHgiO2JyZWFrO2RlZmF1bHQ6ZT10aGlzLm92ZXJmbG93P3M+MD9NYXRoLm1heCgtbiwwKTotaTpuPDA/LW46MCx0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLmNvbnRlbnQuc3R5bGUucmlnaHQ9ZSsicHgiOih0aGlzLmRvbS5jb250ZW50LnN0eWxlLmxlZnQ9ZSsicHgiLHRoaXMuZG9tLmNvbnRlbnQuc3R5bGUud2lkdGg9ImNhbGMoMTAwJSAtICIrZSsicHgpIil9fSxvLnByb3RvdHlwZS5yZXBvc2l0aW9uWT1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtLGU9dGhpcy5kb20uYm94O2Uuc3R5bGUudG9wPSJ0b3AiPT10P3RoaXMudG9wKyJweCI6dGhpcy5wYXJlbnQuaGVpZ2h0LXRoaXMudG9wLXRoaXMuaGVpZ2h0KyJweCJ9LG8ucHJvdG90eXBlLl9yZXBhaW50RHJhZ0xlZnQ9ZnVuY3Rpb24oKXtpZih0aGlzLnNlbGVjdGVkJiZ0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlVGltZSYmIXRoaXMuZG9tLmRyYWdMZWZ0KXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0idmlzLWRyYWctbGVmdCIsdC5kcmFnTGVmdEl0ZW09dGhpcyx0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQodCksdGhpcy5kb20uZHJhZ0xlZnQ9dH1lbHNlIXRoaXMuc2VsZWN0ZWQmJnRoaXMuZG9tLmRyYWdMZWZ0JiYodGhpcy5kb20uZHJhZ0xlZnQucGFyZW50Tm9kZSYmdGhpcy5kb20uZHJhZ0xlZnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5kcmFnTGVmdCksdGhpcy5kb20uZHJhZ0xlZnQ9bnVsbCl9LG8ucHJvdG90eXBlLl9yZXBhaW50RHJhZ1JpZ2h0PWZ1bmN0aW9uKCl7aWYodGhpcy5zZWxlY3RlZCYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWUmJiF0aGlzLmRvbS5kcmFnUmlnaHQpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuY2xhc3NOYW1lPSJ2aXMtZHJhZy1yaWdodCIsdC5kcmFnUmlnaHRJdGVtPXRoaXMsdGhpcy5kb20uYm94LmFwcGVuZENoaWxkKHQpLHRoaXMuZG9tLmRyYWdSaWdodD10fWVsc2UhdGhpcy5zZWxlY3RlZCYmdGhpcy5kb20uZHJhZ1JpZ2h0JiYodGhpcy5kb20uZHJhZ1JpZ2h0LnBhcmVudE5vZGUmJnRoaXMuZG9tLmRyYWdSaWdodC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmRyYWdSaWdodCksdGhpcy5kb20uZHJhZ1JpZ2h0PW51bGwpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlLGkpe3RoaXMuaWQ9bnVsbCx0aGlzLnBhcmVudD1udWxsLHRoaXMuZGF0YT10LHRoaXMuZG9tPW51bGwsdGhpcy5jb252ZXJzaW9uPWV8fHt9LHRoaXMub3B0aW9ucz1pfHx7fSx0aGlzLnNlbGVjdGVkPSExLHRoaXMuZGlzcGxheWVkPSExLHRoaXMuZ3JvdXBTaG93aW5nPSEwLHRoaXMuZGlydHk9ITAsdGhpcy50b3A9bnVsbCx0aGlzLnJpZ2h0PW51bGwsdGhpcy5sZWZ0PW51bGwsdGhpcy53aWR0aD1udWxsLHRoaXMuaGVpZ2h0PW51bGwsdGhpcy5lZGl0YWJsZT1udWxsLHRoaXMuX3VwZGF0ZUVkaXRTdGF0dXMoKX12YXIgcz1pKDYyKSxyPW8ocyksYT1pKDU4KSxoPW8oYSksZD1pKDExMiksbD1pKDEpLHU9aSg4Mik7bi5wcm90b3R5cGUuc3RhY2s9ITAsbi5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD0hMCx0aGlzLmRpcnR5PSEwLHRoaXMuZGlzcGxheWVkJiZ0aGlzLnJlZHJhdygpfSxuLnByb3RvdHlwZS51bnNlbGVjdD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9ITEsdGhpcy5kaXJ0eT0hMCx0aGlzLmRpc3BsYXllZCYmdGhpcy5yZWRyYXcoKX0sbi5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt2b2lkIDAhPXQuZ3JvdXAmJnRoaXMuZGF0YS5ncm91cCE9dC5ncm91cCYmbnVsbCE9dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lml0ZW1TZXQuX21vdmVUb0dyb3VwKHRoaXMsdC5ncm91cCksdGhpcy5wYXJlbnQuc3RhY2tEaXJ0eT0hMCx2b2lkIDAhPXQuc3ViZ3JvdXAmJnRoaXMuZGF0YS5zdWJncm91cCE9dC5zdWJncm91cCYmbnVsbCE9dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmNoYW5nZVN1Ymdyb3VwKHRoaXMsdGhpcy5kYXRhLnN1Ymdyb3VwLHQuc3ViZ3JvdXApLHRoaXMuZGF0YT10LHRoaXMuX3VwZGF0ZUVkaXRTdGF0dXMoKSx0aGlzLmRpcnR5PSEwLHRoaXMuZGlzcGxheWVkJiZ0aGlzLnJlZHJhdygpfSxuLnByb3RvdHlwZS5zZXRQYXJlbnQ9ZnVuY3Rpb24odCl7dGhpcy5kaXNwbGF5ZWQ/KHRoaXMuaGlkZSgpLHRoaXMucGFyZW50PXQsdGhpcy5wYXJlbnQmJnRoaXMuc2hvdygpKTp0aGlzLnBhcmVudD10fSxuLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuITF9LG4ucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbi5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3JldHVybiExfSxuLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt9LG4ucHJvdG90eXBlLnJlcG9zaXRpb25YPWZ1bmN0aW9uKCl7fSxuLnByb3RvdHlwZS5yZXBvc2l0aW9uWT1mdW5jdGlvbigpe30sbi5wcm90b3R5cGUuX3JlcGFpbnREcmFnQ2VudGVyPWZ1bmN0aW9uKCl7aWYodGhpcy5zZWxlY3RlZCYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWUmJiF0aGlzLmRvbS5kcmFnQ2VudGVyKXt2YXIgdD10aGlzLGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc05hbWU9InZpcy1kcmFnLWNlbnRlciIsZS5kcmFnQ2VudGVySXRlbT10aGlzO3ZhciBpPW5ldyBkKGUpO2kub24oInRhcCIsZnVuY3Rpb24oZSl7dC5wYXJlbnQuaXRlbVNldC5ib2R5LmVtaXR0ZXIuZW1pdCgiY2xpY2siLHtldmVudDplLGl0ZW06dC5pZH0pfSksaS5vbigiZG91YmxldGFwIixmdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQucGFyZW50Lml0ZW1TZXQuX29uVXBkYXRlSXRlbSh0KSx0LnBhcmVudC5pdGVtU2V0LmJvZHkuZW1pdHRlci5lbWl0KCJkb3VibGVDbGljayIse2V2ZW50OmUsaXRlbTp0LmlkfSl9KSx0aGlzLmRvbS5ib3g/dGhpcy5kb20uYm94LmFwcGVuZENoaWxkKGUpOnRoaXMuZG9tLnBvaW50JiZ0aGlzLmRvbS5wb2ludC5hcHBlbmRDaGlsZChlKSx0aGlzLmRvbS5kcmFnQ2VudGVyPWV9ZWxzZSF0aGlzLnNlbGVjdGVkJiZ0aGlzLmRvbS5kcmFnQ2VudGVyJiYodGhpcy5kb20uZHJhZ0NlbnRlci5wYXJlbnROb2RlJiZ0aGlzLmRvbS5kcmFnQ2VudGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZHJhZ0NlbnRlciksdGhpcy5kb20uZHJhZ0NlbnRlcj1udWxsKX0sbi5wcm90b3R5cGUuX3JlcGFpbnREZWxldGVCdXR0b249ZnVuY3Rpb24odCl7dmFyIGU9KHRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zfHxudWxsPT10aGlzLmVkaXRhYmxlKSYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnJlbW92ZXx8IXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zJiZudWxsIT10aGlzLmVkaXRhYmxlJiZ0aGlzLmVkaXRhYmxlLnJlbW92ZTtpZih0aGlzLnNlbGVjdGVkJiZlJiYhdGhpcy5kb20uZGVsZXRlQnV0dG9uKXt2YXIgaT10aGlzLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5vcHRpb25zLnJ0bD9vLmNsYXNzTmFtZT0idmlzLWRlbGV0ZS1ydGwiOm8uY2xhc3NOYW1lPSJ2aXMtZGVsZXRlIixvLnRpdGxlPSJEZWxldGUgdGhpcyBpdGVtIixuZXcgZChvKS5vbigidGFwIixmdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpLGkucGFyZW50LnJlbW92ZUZyb21EYXRhU2V0KGkpfSksdC5hcHBlbmRDaGlsZChvKSx0aGlzLmRvbS5kZWxldGVCdXR0b249b31lbHNlIXRoaXMuc2VsZWN0ZWQmJnRoaXMuZG9tLmRlbGV0ZUJ1dHRvbiYmKHRoaXMuZG9tLmRlbGV0ZUJ1dHRvbi5wYXJlbnROb2RlJiZ0aGlzLmRvbS5kZWxldGVCdXR0b24ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5kZWxldGVCdXR0b24pLHRoaXMuZG9tLmRlbGV0ZUJ1dHRvbj1udWxsKX0sbi5wcm90b3R5cGUuX3JlcGFpbnRPbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcD1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMudG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWUpe3ZhciBlPSh0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlVGltZXx8ITA9PT10aGlzLmRhdGEuZWRpdGFibGUpJiYhMSE9PXRoaXMuZGF0YS5lZGl0YWJsZTtpZih0aGlzLnNlbGVjdGVkJiZlJiYhdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXApe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuY2xhc3NOYW1lPSJ2aXMtb25VcGRhdGVUaW1lLXRvb2x0aXAiLHQuYXBwZW5kQ2hpbGQoaSksdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXA9aX1lbHNlIXRoaXMuc2VsZWN0ZWQmJnRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwJiYodGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAucGFyZW50Tm9kZSYmdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCksdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXA9bnVsbCk7aWYodGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXApe3RoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLnZpc2liaWxpdHk9dGhpcy5wYXJlbnQuaXRlbVNldC50b3VjaFBhcmFtcy5pdGVtSXNEcmFnZ2luZz8idmlzaWJsZSI6ImhpZGRlbiIsdGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5zdHlsZS5yaWdodD10aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0OnRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLmxlZnQ9dGhpcy5kb20uY29udGVudC5zdHlsZS5sZWZ0O3ZhciBvLG49dGhpcy5wYXJlbnQuaXRlbVNldC5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcDtvPSJ0b3AiPT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbT90aGlzLnRvcDp0aGlzLnBhcmVudC5oZWlnaHQtdGhpcy50b3AtdGhpcy5oZWlnaHQ7byt0aGlzLnBhcmVudC50b3AtNTA8LW4/KHRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLmJvdHRvbT0iIix0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5zdHlsZS50b3A9dGhpcy5oZWlnaHQrMisicHgiKToodGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUudG9wPSIiLHRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLmJvdHRvbT10aGlzLmhlaWdodCsyKyJweCIpO3ZhciBzLHI7dGhpcy5vcHRpb25zLnRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lJiZ0aGlzLm9wdGlvbnMudG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWUudGVtcGxhdGU/KHI9dGhpcy5vcHRpb25zLnRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lLnRlbXBsYXRlLmJpbmQodGhpcykscz1yKHRoaXMuZGF0YSkpOihzPSJzdGFydDogIit1KHRoaXMuZGF0YS5zdGFydCkuZm9ybWF0KCJNTS9ERC9ZWVlZIGhoOm1tIiksdGhpcy5kYXRhLmVuZCYmKHMrPSI8YnI+IGVuZDogIit1KHRoaXMuZGF0YS5lbmQpLmZvcm1hdCgiTU0vREQvWVlZWSBoaDptbSIpKSksdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuaW5uZXJIVE1MPXN9fX0sbi5wcm90b3R5cGUuX3VwZGF0ZUNvbnRlbnRzPWZ1bmN0aW9uKHQpe3ZhciBlLGksbyxuLHM9dGhpcy5wYXJlbnQuaXRlbVNldC5pdGVtc0RhdGEuZ2V0KHRoaXMuaWQpLHI9dGhpcy5kb20uYm94fHx0aGlzLmRvbS5wb2ludCxhPXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlzLWl0ZW0tdmlzaWJsZS1mcmFtZSIpWzBdO2lmKHRoaXMub3B0aW9ucy52aXNpYmxlRnJhbWVUZW1wbGF0ZT8obj10aGlzLm9wdGlvbnMudmlzaWJsZUZyYW1lVGVtcGxhdGUuYmluZCh0aGlzKSxvPW4ocyxyKSk6bz0iIixhKWlmKG8gaW5zdGFuY2VvZiBPYmplY3QmJiEobyBpbnN0YW5jZW9mIEVsZW1lbnQpKW4ocyxhKTtlbHNle3ZhciBoPXRoaXMuX2NvbnRlbnRUb1N0cmluZyh0aGlzLml0ZW1WaXNpYmxlRnJhbWVDb250ZW50KSE9PXRoaXMuX2NvbnRlbnRUb1N0cmluZyhvKTtpZihoKXtpZihvIGluc3RhbmNlb2YgRWxlbWVudClhLmlubmVySFRNTD0iIixhLmFwcGVuZENoaWxkKG8pO2Vsc2UgaWYodm9pZCAwIT1vKWEuaW5uZXJIVE1MPW87ZWxzZSBpZigiYmFja2dyb3VuZCIhPXRoaXMuZGF0YS50eXBlfHx2b2lkIDAhPT10aGlzLmRhdGEuY29udGVudCl0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnR5ICJjb250ZW50IiBtaXNzaW5nIGluIGl0ZW0gJyt0aGlzLmlkKTt0aGlzLml0ZW1WaXNpYmxlRnJhbWVDb250ZW50PW99fWlmKHRoaXMub3B0aW9ucy50ZW1wbGF0ZT8oaT10aGlzLm9wdGlvbnMudGVtcGxhdGUuYmluZCh0aGlzKSxlPWkocyx0LHRoaXMuZGF0YSkpOmU9dGhpcy5kYXRhLmNvbnRlbnQsZSBpbnN0YW5jZW9mIE9iamVjdCYmIShlIGluc3RhbmNlb2YgRWxlbWVudCkpaShzLHQpO2Vsc2V7dmFyIGg9dGhpcy5fY29udGVudFRvU3RyaW5nKHRoaXMuY29udGVudCkhPT10aGlzLl9jb250ZW50VG9TdHJpbmcoZSk7aWYoaCl7aWYoZSBpbnN0YW5jZW9mIEVsZW1lbnQpdC5pbm5lckhUTUw9IiIsdC5hcHBlbmRDaGlsZChlKTtlbHNlIGlmKHZvaWQgMCE9ZSl0LmlubmVySFRNTD1lO2Vsc2UgaWYoImJhY2tncm91bmQiIT10aGlzLmRhdGEudHlwZXx8dm9pZCAwIT09dGhpcy5kYXRhLmNvbnRlbnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSAiY29udGVudCIgbWlzc2luZyBpbiBpdGVtICcrdGhpcy5pZCk7dGhpcy5jb250ZW50PWV9fX0sbi5wcm90b3R5cGUuX3VwZGF0ZURhdGFBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5kYXRhQXR0cmlidXRlcyYmdGhpcy5vcHRpb25zLmRhdGFBdHRyaWJ1dGVzLmxlbmd0aD4wKXt2YXIgZT1bXTtpZihBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5kYXRhQXR0cmlidXRlcykpZT10aGlzLm9wdGlvbnMuZGF0YUF0dHJpYnV0ZXM7ZWxzZXtpZigiYWxsIiE9dGhpcy5vcHRpb25zLmRhdGFBdHRyaWJ1dGVzKXJldHVybjtlPSgwLGguZGVmYXVsdCkodGhpcy5kYXRhKX1mb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXSxuPXRoaXMuZGF0YVtvXTtudWxsIT1uP3Quc2V0QXR0cmlidXRlKCJkYXRhLSIrbyxuKTp0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS0iK28pfX19LG4ucHJvdG90eXBlLl91cGRhdGVTdHlsZT1mdW5jdGlvbih0KXt0aGlzLnN0eWxlJiYobC5yZW1vdmVDc3NUZXh0KHQsdGhpcy5zdHlsZSksdGhpcy5zdHlsZT1udWxsKSx0aGlzLmRhdGEuc3R5bGUmJihsLmFkZENzc1RleHQodCx0aGlzLmRhdGEuc3R5bGUpLHRoaXMuc3R5bGU9dGhpcy5kYXRhLnN0eWxlKX0sbi5wcm90b3R5cGUuX2NvbnRlbnRUb1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/dDp0JiYib3V0ZXJIVE1MImluIHQ/dC5vdXRlckhUTUw6dH0sbi5wcm90b3R5cGUuX3VwZGF0ZUVkaXRTdGF0dXM9ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMmJigiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuZWRpdGFibGU/dGhpcy5lZGl0YWJsZT17dXBkYXRlVGltZTp0aGlzLm9wdGlvbnMuZWRpdGFibGUsdXBkYXRlR3JvdXA6dGhpcy5vcHRpb25zLmVkaXRhYmxlLHJlbW92ZTp0aGlzLm9wdGlvbnMuZWRpdGFibGV9OiJvYmplY3QiPT09KDAsci5kZWZhdWx0KSh0aGlzLm9wdGlvbnMuZWRpdGFibGUpJiYodGhpcy5lZGl0YWJsZT17fSxsLnNlbGVjdGl2ZUV4dGVuZChbInVwZGF0ZVRpbWUiLCJ1cGRhdGVHcm91cCIsInJlbW92ZSJdLHRoaXMuZWRpdGFibGUsdGhpcy5vcHRpb25zLmVkaXRhYmxlKSkpLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmVkaXRhYmxlJiYhMD09PXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zfHx0aGlzLmRhdGEmJigiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmRhdGEuZWRpdGFibGU/dGhpcy5lZGl0YWJsZT17dXBkYXRlVGltZTp0aGlzLmRhdGEuZWRpdGFibGUsdXBkYXRlR3JvdXA6dGhpcy5kYXRhLmVkaXRhYmxlLHJlbW92ZTp0aGlzLmRhdGEuZWRpdGFibGV9OiJvYmplY3QiPT09KDAsci5kZWZhdWx0KSh0aGlzLmRhdGEuZWRpdGFibGUpJiYodGhpcy5lZGl0YWJsZT17fSxsLnNlbGVjdGl2ZUV4dGVuZChbInVwZGF0ZVRpbWUiLCJ1cGRhdGVHcm91cCIsInJlbW92ZSJdLHRoaXMuZWRpdGFibGUsdGhpcy5kYXRhLmVkaXRhYmxlKSkpfSxuLnByb3RvdHlwZS5nZXRXaWR0aExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbi5wcm90b3R5cGUuZ2V0V2lkdGhSaWdodD1mdW5jdGlvbigpe3JldHVybiAwfSxuLnByb3RvdHlwZS5nZXRUaXRsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGEudGl0bGV9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSl7ci5jYWxsKHRoaXMsdCxlLGkpLHRoaXMud2lkdGg9MCx0aGlzLmhlaWdodD0wLHRoaXMudG9wPTAsdGhpcy5sZWZ0PTB9dmFyIG49aSg1NSkscz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KG4pLHI9KGkoMSksaSgxMjUpKTtvLnByb3RvdHlwZT0oMCxzLmRlZmF1bHQpKHIucHJvdG90eXBlKSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCxlLGkpe3RoaXMudmlzaWJsZUl0ZW1zPXRoaXMuX3VwZGF0ZUl0ZW1zSW5SYW5nZSh0aGlzLm9yZGVyZWRJdGVtcyx0aGlzLnZpc2libGVJdGVtcyx0KSx0aGlzLndpZHRoPXRoaXMuZG9tLmJhY2tncm91bmQub2Zmc2V0V2lkdGgsdGhpcy5kb20uYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQ9IjAiO2Zvcih2YXIgbz0wLG49dGhpcy52aXNpYmxlSXRlbXMubGVuZ3RoO288bjtvKyspe3RoaXMudmlzaWJsZUl0ZW1zW29dLnJlcG9zaXRpb25ZKGUpfXJldHVybiExfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kb20uYmFja2dyb3VuZC5wYXJlbnROb2RlfHx0aGlzLml0ZW1TZXQuZG9tLmJhY2tncm91bmQuYXBwZW5kQ2hpbGQodGhpcy5kb20uYmFja2dyb3VuZCl9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSl7aWYodGhpcy5wcm9wcz17ZG90Ont3aWR0aDowLGhlaWdodDowfSxsaW5lOnt3aWR0aDowLGhlaWdodDowfX0sdGhpcy5vcHRpb25zPWksdCYmdm9pZCAwPT10LnN0YXJ0KXRocm93IG5ldyBFcnJvcignUHJvcGVydHkgInN0YXJ0IiBtaXNzaW5nIGluIGl0ZW0gJyt0KTtuLmNhbGwodGhpcyx0LGUsaSl9dmFyIG49aSgxMjgpO2koMSk7by5wcm90b3R5cGU9bmV3IG4obnVsbCxudWxsLG51bGwpLG8ucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMuYWxpZ24saT10aGlzLndpZHRoKnQuZ2V0TWlsbGlzZWNvbmRzUGVyUGl4ZWwoKTtyZXR1cm4icmlnaHQiPT1lP3RoaXMuZGF0YS5zdGFydC5nZXRUaW1lKCk+dC5zdGFydCYmdGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKS1pPHQuZW5kOiJsZWZ0Ij09ZT90aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpK2k+dC5zdGFydCYmdGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKTx0LmVuZDp0aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpK2kvMj50LnN0YXJ0JiZ0aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpLWkvMjx0LmVuZH0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kb207aWYodHx8KHRoaXMuZG9tPXt9LHQ9dGhpcy5kb20sdC5ib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksdC5jb250ZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHQuY29udGVudC5jbGFzc05hbWU9InZpcy1pdGVtLWNvbnRlbnQiLHQuYm94LmFwcGVuZENoaWxkKHQuY29udGVudCksdC5saW5lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHQubGluZS5jbGFzc05hbWU9InZpcy1saW5lIix0LmRvdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0LmRvdC5jbGFzc05hbWU9InZpcy1kb3QiLHQuYm94WyJ0aW1lbGluZS1pdGVtIl09dGhpcyx0aGlzLmRpcnR5PSEwKSwhdGhpcy5wYXJlbnQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVkcmF3IGl0ZW06IG5vIHBhcmVudCBhdHRhY2hlZCIpO2lmKCF0LmJveC5wYXJlbnROb2RlKXt2YXIgZT10aGlzLnBhcmVudC5kb20uZm9yZWdyb3VuZDtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBmb3JlZ3JvdW5kIGNvbnRhaW5lciBlbGVtZW50Iik7ZS5hcHBlbmRDaGlsZCh0LmJveCl9aWYoIXQubGluZS5wYXJlbnROb2RlKXt2YXIgaT10aGlzLnBhcmVudC5kb20uYmFja2dyb3VuZDtpZighaSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBiYWNrZ3JvdW5kIGNvbnRhaW5lciBlbGVtZW50Iik7aS5hcHBlbmRDaGlsZCh0LmxpbmUpfWlmKCF0LmRvdC5wYXJlbnROb2RlKXt2YXIgbz10aGlzLnBhcmVudC5kb20uYXhpcztpZighaSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBheGlzIGNvbnRhaW5lciBlbGVtZW50Iik7by5hcHBlbmRDaGlsZCh0LmRvdCl9aWYodGhpcy5kaXNwbGF5ZWQ9ITAsdGhpcy5kaXJ0eSl7dGhpcy5fdXBkYXRlQ29udGVudHModGhpcy5kb20uY29udGVudCksdGhpcy5fdXBkYXRlRGF0YUF0dHJpYnV0ZXModGhpcy5kb20uYm94KSx0aGlzLl91cGRhdGVTdHlsZSh0aGlzLmRvbS5ib3gpO3ZhciBuPXRoaXMuZWRpdGFibGUudXBkYXRlVGltZXx8dGhpcy5lZGl0YWJsZS51cGRhdGVHcm91cCxzPSh0aGlzLmRhdGEuY2xhc3NOYW1lPyIgIit0aGlzLmRhdGEuY2xhc3NOYW1lOiIiKSsodGhpcy5zZWxlY3RlZD8iIHZpcy1zZWxlY3RlZCI6IiIpKyhuPyIgdmlzLWVkaXRhYmxlIjoiIHZpcy1yZWFkb25seSIpO3QuYm94LmNsYXNzTmFtZT0idmlzLWl0ZW0gdmlzLWJveCIrcyx0LmxpbmUuY2xhc3NOYW1lPSJ2aXMtaXRlbSB2aXMtbGluZSIrcyx0LmRvdC5jbGFzc05hbWU9InZpcy1pdGVtIHZpcy1kb3QiK3M7dmFyIHI9dC5ib3guc3R5bGUucmlnaHQsYT10LmJveC5zdHlsZS5sZWZ0O3RoaXMub3B0aW9ucy5ydGw/dC5ib3guc3R5bGUucmlnaHQ9IjBweCI6dC5ib3guc3R5bGUubGVmdD0iMHB4Iix0aGlzLnByb3BzLmRvdC5oZWlnaHQ9dC5kb3Qub2Zmc2V0SGVpZ2h0LHRoaXMucHJvcHMuZG90LndpZHRoPXQuZG90Lm9mZnNldFdpZHRoLHRoaXMucHJvcHMubGluZS53aWR0aD10LmxpbmUub2Zmc2V0V2lkdGgsdGhpcy53aWR0aD10LmJveC5vZmZzZXRXaWR0aCx0aGlzLmhlaWdodD10LmJveC5vZmZzZXRIZWlnaHQsdGhpcy5vcHRpb25zLnJ0bD90LmJveC5zdHlsZS5yaWdodD1yOnQuYm94LnN0eWxlLmxlZnQ9YSx0aGlzLmRpcnR5PSExfXRoaXMuX3JlcGFpbnRPbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCh0LmJveCksdGhpcy5fcmVwYWludERyYWdDZW50ZXIoKSx0aGlzLl9yZXBhaW50RGVsZXRlQnV0dG9uKHQuYm94KX0sby5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuZGlzcGxheWVkfHx0aGlzLnJlZHJhdygpfSxvLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7aWYodGhpcy5kaXNwbGF5ZWQpe3ZhciB0PXRoaXMuZG9tO3QuYm94LnBhcmVudE5vZGUmJnQuYm94LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodC5ib3gpLHQubGluZS5wYXJlbnROb2RlJiZ0LmxpbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0LmxpbmUpLHQuZG90LnBhcmVudE5vZGUmJnQuZG90LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodC5kb3QpLHRoaXMuZGlzcGxheWVkPSExfX0sby5wcm90b3R5cGUucmVwb3NpdGlvblg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnZlcnNpb24udG9TY3JlZW4odGhpcy5kYXRhLnN0YXJ0KSxlPXRoaXMub3B0aW9ucy5hbGlnbjsicmlnaHQiPT1lP3RoaXMub3B0aW9ucy5ydGw/KHRoaXMucmlnaHQ9dC10aGlzLndpZHRoLHRoaXMuZG9tLmJveC5zdHlsZS5yaWdodD10aGlzLnJpZ2h0KyJweCIsdGhpcy5kb20ubGluZS5zdHlsZS5yaWdodD10LXRoaXMucHJvcHMubGluZS53aWR0aCsicHgiLHRoaXMuZG9tLmRvdC5zdHlsZS5yaWdodD10LXRoaXMucHJvcHMubGluZS53aWR0aC8yLXRoaXMucHJvcHMuZG90LndpZHRoLzIrInB4Iik6KHRoaXMubGVmdD10LXRoaXMud2lkdGgsdGhpcy5kb20uYm94LnN0eWxlLmxlZnQ9dGhpcy5sZWZ0KyJweCIsdGhpcy5kb20ubGluZS5zdHlsZS5sZWZ0PXQtdGhpcy5wcm9wcy5saW5lLndpZHRoKyJweCIsdGhpcy5kb20uZG90LnN0eWxlLmxlZnQ9dC10aGlzLnByb3BzLmxpbmUud2lkdGgvMi10aGlzLnByb3BzLmRvdC53aWR0aC8yKyJweCIpOiJsZWZ0Ij09ZT90aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQsdGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0PXRoaXMucmlnaHQrInB4Iix0aGlzLmRvbS5saW5lLnN0eWxlLnJpZ2h0PXQrInB4Iix0aGlzLmRvbS5kb3Quc3R5bGUucmlnaHQ9dCt0aGlzLnByb3BzLmxpbmUud2lkdGgvMi10aGlzLnByb3BzLmRvdC53aWR0aC8yKyJweCIpOih0aGlzLmxlZnQ9dCx0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10aGlzLmxlZnQrInB4Iix0aGlzLmRvbS5saW5lLnN0eWxlLmxlZnQ9dCsicHgiLHRoaXMuZG9tLmRvdC5zdHlsZS5sZWZ0PXQrdGhpcy5wcm9wcy5saW5lLndpZHRoLzItdGhpcy5wcm9wcy5kb3Qud2lkdGgvMisicHgiKTp0aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQtdGhpcy53aWR0aC8yLHRoaXMuZG9tLmJveC5zdHlsZS5yaWdodD10aGlzLnJpZ2h0KyJweCIsdGhpcy5kb20ubGluZS5zdHlsZS5yaWdodD10LXRoaXMucHJvcHMubGluZS53aWR0aCsicHgiLHRoaXMuZG9tLmRvdC5zdHlsZS5yaWdodD10LXRoaXMucHJvcHMuZG90LndpZHRoLzIrInB4Iik6KHRoaXMubGVmdD10LXRoaXMud2lkdGgvMix0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10aGlzLmxlZnQrInB4Iix0aGlzLmRvbS5saW5lLnN0eWxlLmxlZnQ9dC10aGlzLnByb3BzLmxpbmUud2lkdGgvMisicHgiLHRoaXMuZG9tLmRvdC5zdHlsZS5sZWZ0PXQtdGhpcy5wcm9wcy5kb3Qud2lkdGgvMisicHgiKX0sby5wcm90b3R5cGUucmVwb3NpdGlvblk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbSxlPXRoaXMuZG9tLmJveCxpPXRoaXMuZG9tLmxpbmUsbz10aGlzLmRvbS5kb3Q7aWYoInRvcCI9PXQpZS5zdHlsZS50b3A9KHRoaXMudG9wfHwwKSsicHgiLGkuc3R5bGUudG9wPSIwIixpLnN0eWxlLmhlaWdodD10aGlzLnBhcmVudC50b3ArdGhpcy50b3ArMSsicHgiLGkuc3R5bGUuYm90dG9tPSIiO2Vsc2V7dmFyIG49dGhpcy5wYXJlbnQuaXRlbVNldC5wcm9wcy5oZWlnaHQscz1uLXRoaXMucGFyZW50LnRvcC10aGlzLnBhcmVudC5oZWlnaHQrdGhpcy50b3A7ZS5zdHlsZS50b3A9KHRoaXMucGFyZW50LmhlaWdodC10aGlzLnRvcC10aGlzLmhlaWdodHx8MCkrInB4IixpLnN0eWxlLnRvcD1uLXMrInB4IixpLnN0eWxlLmJvdHRvbT0iMCJ9by5zdHlsZS50b3A9LXRoaXMucHJvcHMuZG90LmhlaWdodC8yKyJweCJ9LG8ucHJvdG90eXBlLmdldFdpZHRoTGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLndpZHRoLzJ9LG8ucHJvdG90eXBlLmdldFdpZHRoUmlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWR0aC8yfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKHRoaXMucHJvcHM9e2RvdDp7dG9wOjAsd2lkdGg6MCxoZWlnaHQ6MH0sY29udGVudDp7aGVpZ2h0OjAsbWFyZ2luTGVmdDowLG1hcmdpblJpZ2h0OjB9fSx0aGlzLm9wdGlvbnM9aSx0JiZ2b2lkIDA9PXQuc3RhcnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSAic3RhcnQiIG1pc3NpbmcgaW4gaXRlbSAnK3QpO24uY2FsbCh0aGlzLHQsZSxpKX12YXIgbj1pKDEyOCk7by5wcm90b3R5cGU9bmV3IG4obnVsbCxudWxsLG51bGwpLG8ucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLndpZHRoKnQuZ2V0TWlsbGlzZWNvbmRzUGVyUGl4ZWwoKTtyZXR1cm4gdGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKStlPnQuc3RhcnQmJnRoaXMuZGF0YS5zdGFydDx0LmVuZH0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kb207aWYodHx8KHRoaXMuZG9tPXt9LHQ9dGhpcy5kb20sdC5wb2ludD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LmNvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5jb250ZW50LmNsYXNzTmFtZT0idmlzLWl0ZW0tY29udGVudCIsdC5wb2ludC5hcHBlbmRDaGlsZCh0LmNvbnRlbnQpLHQuZG90PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHQucG9pbnQuYXBwZW5kQ2hpbGQodC5kb3QpLHQucG9pbnRbInRpbWVsaW5lLWl0ZW0iXT10aGlzLHRoaXMuZGlydHk9ITApLCF0aGlzLnBhcmVudCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWRyYXcgaXRlbTogbm8gcGFyZW50IGF0dGFjaGVkIik7aWYoIXQucG9pbnQucGFyZW50Tm9kZSl7dmFyIGU9dGhpcy5wYXJlbnQuZG9tLmZvcmVncm91bmQ7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVkcmF3IGl0ZW06IHBhcmVudCBoYXMgbm8gZm9yZWdyb3VuZCBjb250YWluZXIgZWxlbWVudCIpO2UuYXBwZW5kQ2hpbGQodC5wb2ludCl9aWYodGhpcy5kaXNwbGF5ZWQ9ITAsdGhpcy5kaXJ0eSl7dGhpcy5fdXBkYXRlQ29udGVudHModGhpcy5kb20uY29udGVudCksdGhpcy5fdXBkYXRlRGF0YUF0dHJpYnV0ZXModGhpcy5kb20ucG9pbnQpLHRoaXMuX3VwZGF0ZVN0eWxlKHRoaXMuZG9tLnBvaW50KTt2YXIgaT10aGlzLmVkaXRhYmxlLnVwZGF0ZVRpbWV8fHRoaXMuZWRpdGFibGUudXBkYXRlR3JvdXAsbz0odGhpcy5kYXRhLmNsYXNzTmFtZT8iICIrdGhpcy5kYXRhLmNsYXNzTmFtZToiIikrKHRoaXMuc2VsZWN0ZWQ/IiB2aXMtc2VsZWN0ZWQiOiIiKSsoaT8iIHZpcy1lZGl0YWJsZSI6IiB2aXMtcmVhZG9ubHkiKTt0LnBvaW50LmNsYXNzTmFtZT0idmlzLWl0ZW0gdmlzLXBvaW50IitvLHQuZG90LmNsYXNzTmFtZT0idmlzLWl0ZW0gdmlzLWRvdCIrbyx0aGlzLnByb3BzLmRvdC53aWR0aD10LmRvdC5vZmZzZXRXaWR0aCx0aGlzLnByb3BzLmRvdC5oZWlnaHQ9dC5kb3Qub2Zmc2V0SGVpZ2h0LHRoaXMucHJvcHMuY29udGVudC5oZWlnaHQ9dC5jb250ZW50Lm9mZnNldEhlaWdodCx0aGlzLm9wdGlvbnMucnRsP3QuY29udGVudC5zdHlsZS5tYXJnaW5SaWdodD0yKnRoaXMucHJvcHMuZG90LndpZHRoKyJweCI6dC5jb250ZW50LnN0eWxlLm1hcmdpbkxlZnQ9Mip0aGlzLnByb3BzLmRvdC53aWR0aCsicHgiLHRoaXMud2lkdGg9dC5wb2ludC5vZmZzZXRXaWR0aCx0aGlzLmhlaWdodD10LnBvaW50Lm9mZnNldEhlaWdodCx0LmRvdC5zdHlsZS50b3A9KHRoaXMuaGVpZ2h0LXRoaXMucHJvcHMuZG90LmhlaWdodCkvMisicHgiLHRoaXMub3B0aW9ucy5ydGw/dC5kb3Quc3R5bGUucmlnaHQ9dGhpcy5wcm9wcy5kb3Qud2lkdGgvMisicHgiOnQuZG90LnN0eWxlLmxlZnQ9dGhpcy5wcm9wcy5kb3Qud2lkdGgvMisicHgiLHRoaXMuZGlydHk9ITF9dGhpcy5fcmVwYWludE9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwKHQucG9pbnQpLHRoaXMuX3JlcGFpbnREcmFnQ2VudGVyKCksCnRoaXMuX3JlcGFpbnREZWxldGVCdXR0b24odC5wb2ludCl9LG8ucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXllZHx8dGhpcy5yZWRyYXcoKX0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuZGlzcGxheWVkJiYodGhpcy5kb20ucG9pbnQucGFyZW50Tm9kZSYmdGhpcy5kb20ucG9pbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5wb2ludCksdGhpcy5kaXNwbGF5ZWQ9ITEpfSxvLnByb3RvdHlwZS5yZXBvc2l0aW9uWD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udmVyc2lvbi50b1NjcmVlbih0aGlzLmRhdGEuc3RhcnQpO3RoaXMub3B0aW9ucy5ydGw/KHRoaXMucmlnaHQ9dC10aGlzLnByb3BzLmRvdC53aWR0aCx0aGlzLmRvbS5wb2ludC5zdHlsZS5yaWdodD10aGlzLnJpZ2h0KyJweCIpOih0aGlzLmxlZnQ9dC10aGlzLnByb3BzLmRvdC53aWR0aCx0aGlzLmRvbS5wb2ludC5zdHlsZS5sZWZ0PXRoaXMubGVmdCsicHgiKX0sby5wcm90b3R5cGUucmVwb3NpdGlvblk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbSxlPXRoaXMuZG9tLnBvaW50O2Uuc3R5bGUudG9wPSJ0b3AiPT10P3RoaXMudG9wKyJweCI6dGhpcy5wYXJlbnQuaGVpZ2h0LXRoaXMudG9wLXRoaXMuaGVpZ2h0KyJweCJ9LG8ucHJvdG90eXBlLmdldFdpZHRoTGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3BzLmRvdC53aWR0aH0sby5wcm90b3R5cGUuZ2V0V2lkdGhSaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3BzLmRvdC53aWR0aH0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXtpZih0aGlzLnByb3BzPXtjb250ZW50Ont3aWR0aDowfX0sdGhpcy5vdmVyZmxvdz0hMSx0KXtpZih2b2lkIDA9PXQuc3RhcnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSAic3RhcnQiIG1pc3NpbmcgaW4gaXRlbSAnK3QuaWQpO2lmKHZvaWQgMD09dC5lbmQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSAiZW5kIiBtaXNzaW5nIGluIGl0ZW0gJyt0LmlkKX1uLmNhbGwodGhpcyx0LGUsaSl9dmFyIG49KGkoMTEyKSxpKDEyOCkpLHM9aSgxMjkpLHI9aSgxMjcpO28ucHJvdG90eXBlPW5ldyBuKG51bGwsbnVsbCxudWxsKSxvLnByb3RvdHlwZS5iYXNlQ2xhc3NOYW1lPSJ2aXMtaXRlbSB2aXMtYmFja2dyb3VuZCIsby5wcm90b3R5cGUuc3RhY2s9ITEsby5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGEuc3RhcnQ8dC5lbmQmJnRoaXMuZGF0YS5lbmQ+dC5zdGFydH0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kb207aWYodHx8KHRoaXMuZG9tPXt9LHQ9dGhpcy5kb20sdC5ib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5mcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LmZyYW1lLmNsYXNzTmFtZT0idmlzLWl0ZW0tb3ZlcmZsb3ciLHQuYm94LmFwcGVuZENoaWxkKHQuZnJhbWUpLHQuY29udGVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LmNvbnRlbnQuY2xhc3NOYW1lPSJ2aXMtaXRlbS1jb250ZW50Iix0LmZyYW1lLmFwcGVuZENoaWxkKHQuY29udGVudCksdGhpcy5kaXJ0eT0hMCksIXRoaXMucGFyZW50KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlZHJhdyBpdGVtOiBubyBwYXJlbnQgYXR0YWNoZWQiKTtpZighdC5ib3gucGFyZW50Tm9kZSl7dmFyIGU9dGhpcy5wYXJlbnQuZG9tLmJhY2tncm91bmQ7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVkcmF3IGl0ZW06IHBhcmVudCBoYXMgbm8gYmFja2dyb3VuZCBjb250YWluZXIgZWxlbWVudCIpO2UuYXBwZW5kQ2hpbGQodC5ib3gpfWlmKHRoaXMuZGlzcGxheWVkPSEwLHRoaXMuZGlydHkpe3RoaXMuX3VwZGF0ZUNvbnRlbnRzKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuX3VwZGF0ZURhdGFBdHRyaWJ1dGVzKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuX3VwZGF0ZVN0eWxlKHRoaXMuZG9tLmJveCk7dmFyIGk9KHRoaXMuZGF0YS5jbGFzc05hbWU/IiAiK3RoaXMuZGF0YS5jbGFzc05hbWU6IiIpKyh0aGlzLnNlbGVjdGVkPyIgdmlzLXNlbGVjdGVkIjoiIik7dC5ib3guY2xhc3NOYW1lPXRoaXMuYmFzZUNsYXNzTmFtZStpLHRoaXMub3ZlcmZsb3c9ImhpZGRlbiIhPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LmNvbnRlbnQpLm92ZXJmbG93LHRoaXMucHJvcHMuY29udGVudC53aWR0aD10aGlzLmRvbS5jb250ZW50Lm9mZnNldFdpZHRoLHRoaXMuaGVpZ2h0PTAsdGhpcy5kaXJ0eT0hMX19LG8ucHJvdG90eXBlLnNob3c9ci5wcm90b3R5cGUuc2hvdyxvLnByb3RvdHlwZS5oaWRlPXIucHJvdG90eXBlLmhpZGUsby5wcm90b3R5cGUucmVwb3NpdGlvblg9ci5wcm90b3R5cGUucmVwb3NpdGlvblgsby5wcm90b3R5cGUucmVwb3NpdGlvblk9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbTtpZih2b2lkIDAhPT10aGlzLmRhdGEuc3ViZ3JvdXApe3ZhciBvPXRoaXMuZGF0YS5zdWJncm91cCxuPXRoaXMucGFyZW50LnN1Ymdyb3VwcztuW29dLmluZGV4O3RoaXMuZG9tLmJveC5zdHlsZS5oZWlnaHQ9dGhpcy5wYXJlbnQuc3ViZ3JvdXBzW29dLmhlaWdodCsicHgiLHRoaXMuZG9tLmJveC5zdHlsZS50b3A9InRvcCI9PWk/dGhpcy5wYXJlbnQudG9wK3RoaXMucGFyZW50LnN1Ymdyb3Vwc1tvXS50b3ArInB4Ijp0aGlzLnBhcmVudC50b3ArdGhpcy5wYXJlbnQuaGVpZ2h0LXRoaXMucGFyZW50LnN1Ymdyb3Vwc1tvXS50b3AtdGhpcy5wYXJlbnQuc3ViZ3JvdXBzW29dLmhlaWdodCsicHgiLHRoaXMuZG9tLmJveC5zdHlsZS5ib3R0b209IiJ9ZWxzZSB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIHM/KGU9TWF0aC5tYXgodGhpcy5wYXJlbnQuaGVpZ2h0LHRoaXMucGFyZW50Lml0ZW1TZXQuYm9keS5kb21Qcm9wcy5jZW50ZXIuaGVpZ2h0LHRoaXMucGFyZW50Lml0ZW1TZXQuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0KSx0aGlzLmRvbS5ib3guc3R5bGUuYm90dG9tPSJib3R0b20iPT1pPyIwIjoiIix0aGlzLmRvbS5ib3guc3R5bGUudG9wPSJ0b3AiPT1pPyIwIjoiIik6KGU9dGhpcy5wYXJlbnQuaGVpZ2h0LHRoaXMuZG9tLmJveC5zdHlsZS50b3A9dGhpcy5wYXJlbnQudG9wKyJweCIsdGhpcy5kb20uYm94LnN0eWxlLmJvdHRvbT0iIik7dGhpcy5kb20uYm94LnN0eWxlLmhlaWdodD1lKyJweCJ9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTM0KSxzPW8obikscj1pKDEzNSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuY29udGFpbmVyPWUsdGhpcy5vdmVyZmxvd01ldGhvZD1pfHwiY2FwIix0aGlzLng9MCx0aGlzLnk9MCx0aGlzLnBhZGRpbmc9NSx0aGlzLmhpZGRlbj0hMSx0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZnJhbWUuY2xhc3NOYW1lPSJ2aXMtdG9vbHRpcCIsdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OiJzZXRQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLng9cGFyc2VJbnQodCksdGhpcy55PXBhcnNlSW50KGUpfX0se2tleToic2V0VGV4dCIsdmFsdWU6ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIEVsZW1lbnQ/KHRoaXMuZnJhbWUuaW5uZXJIVE1MPSIiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodCkpOnRoaXMuZnJhbWUuaW5uZXJIVE1MPXR9fSx7a2V5OiJzaG93Iix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10JiYodD0hMCksITA9PT10KXt2YXIgZT10aGlzLmZyYW1lLmNsaWVudEhlaWdodCxpPXRoaXMuZnJhbWUuY2xpZW50V2lkdGgsbz10aGlzLmZyYW1lLnBhcmVudE5vZGUuY2xpZW50SGVpZ2h0LG49dGhpcy5mcmFtZS5wYXJlbnROb2RlLmNsaWVudFdpZHRoLHM9MCxyPTA7aWYoImZsaXAiPT10aGlzLm92ZXJmbG93TWV0aG9kKXt2YXIgYT0hMSxoPSEwO3RoaXMueS1lPHRoaXMucGFkZGluZyYmKGg9ITEpLHRoaXMueCtpPm4tdGhpcy5wYWRkaW5nJiYoYT0hMCkscz1hP3RoaXMueC1pOnRoaXMueCxyPWg/dGhpcy55LWU6dGhpcy55fWVsc2Ugcj10aGlzLnktZSxyK2UrdGhpcy5wYWRkaW5nPm8mJihyPW8tZS10aGlzLnBhZGRpbmcpLHI8dGhpcy5wYWRkaW5nJiYocj10aGlzLnBhZGRpbmcpLHM9dGhpcy54LHMraSt0aGlzLnBhZGRpbmc+biYmKHM9bi1pLXRoaXMucGFkZGluZyksczx0aGlzLnBhZGRpbmcmJihzPXRoaXMucGFkZGluZyk7dGhpcy5mcmFtZS5zdHlsZS5sZWZ0PXMrInB4Iix0aGlzLmZyYW1lLnN0eWxlLnRvcD1yKyJweCIsdGhpcy5mcmFtZS5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIix0aGlzLmhpZGRlbj0hMX1lbHNlIHRoaXMuaGlkZSgpfX0se2tleToiaGlkZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhpZGRlbj0hMCx0aGlzLmZyYW1lLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9fSx7a2V5OiJkZXN0cm95Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmZyYW1lKX19XSksdH0oKTtlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlKXtlLl9fZXNNb2R1bGU9ITAsZS5kZWZhdWx0PWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fSxmdW5jdGlvbih0LGUsaSl7ZS5fX2VzTW9kdWxlPSEwO3ZhciBvPWkoMTM2KSxuPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0obyk7ZS5kZWZhdWx0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksKDAsbi5kZWZhdWx0KSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDEzNyksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKHQsZSxpKXtpKDEzOCk7dmFyIG89aSgxNykuT2JqZWN0O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG8uZGVmaW5lUHJvcGVydHkodCxlLGkpfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTUpO28oby5TK28uRiohaSgyNSksIk9iamVjdCIse2RlZmluZVByb3BlcnR5OmkoMjEpLmZ9KX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLmRvbT17Zm9yZWdyb3VuZDpudWxsLGxpbmVzOltdLG1ham9yVGV4dHM6W10sbWlub3JUZXh0czpbXSxyZWR1bmRhbnQ6e2xpbmVzOltdLG1ham9yVGV4dHM6W10sbWlub3JUZXh0czpbXX19LHRoaXMucHJvcHM9e3JhbmdlOntzdGFydDowLGVuZDowLG1pbmltdW1TdGVwOjB9LGxpbmVUb3A6MH0sdGhpcy5kZWZhdWx0T3B0aW9ucz17b3JpZW50YXRpb246e2F4aXM6ImJvdHRvbSJ9LHNob3dNaW5vckxhYmVsczohMCxzaG93TWFqb3JMYWJlbHM6ITAsbWF4TWlub3JDaGFyczo3LGZvcm1hdDpoLkZPUk1BVCxtb21lbnQ6bCx0aW1lQXhpczpudWxsfSx0aGlzLm9wdGlvbnM9ci5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5ib2R5PXQsdGhpcy5fY3JlYXRlKCksdGhpcy5zZXRPcHRpb25zKGUpfXZhciBuPWkoNjIpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMSksYT1pKDEyMCksaD1pKDEyNCksZD1pKDEyMSksbD1pKDgyKTtvLnByb3RvdHlwZT1uZXcgYSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJihyLnNlbGVjdGl2ZUV4dGVuZChbInNob3dNaW5vckxhYmVscyIsInNob3dNYWpvckxhYmVscyIsIm1heE1pbm9yQ2hhcnMiLCJoaWRkZW5EYXRlcyIsInRpbWVBeGlzIiwibW9tZW50IiwicnRsIl0sdGhpcy5vcHRpb25zLHQpLHIuc2VsZWN0aXZlRGVlcEV4dGVuZChbImZvcm1hdCJdLHRoaXMub3B0aW9ucyx0KSwib3JpZW50YXRpb24iaW4gdCYmKCJzdHJpbmciPT10eXBlb2YgdC5vcmllbnRhdGlvbj90aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcz10Lm9yaWVudGF0aW9uOiJvYmplY3QiPT09KDAscy5kZWZhdWx0KSh0Lm9yaWVudGF0aW9uKSYmImF4aXMiaW4gdC5vcmllbnRhdGlvbiYmKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzPXQub3JpZW50YXRpb24uYXhpcykpLCJsb2NhbGUiaW4gdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiBsLmxvY2FsZT9sLmxvY2FsZSh0LmxvY2FsZSk6bC5sYW5nKHQubG9jYWxlKSkpfSxvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb20uZm9yZWdyb3VuZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5iYWNrZ3JvdW5kPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmZvcmVncm91bmQuY2xhc3NOYW1lPSJ2aXMtdGltZS1heGlzIHZpcy1mb3JlZ3JvdW5kIix0aGlzLmRvbS5iYWNrZ3JvdW5kLmNsYXNzTmFtZT0idmlzLXRpbWUtYXhpcyB2aXMtYmFja2dyb3VuZCJ9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmRvbS5mb3JlZ3JvdW5kLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZvcmVncm91bmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5mb3JlZ3JvdW5kKSx0aGlzLmRvbS5iYWNrZ3JvdW5kLnBhcmVudE5vZGUmJnRoaXMuZG9tLmJhY2tncm91bmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kKSx0aGlzLmJvZHk9bnVsbH0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPXRoaXMuZG9tLmZvcmVncm91bmQsaT10aGlzLmRvbS5iYWNrZ3JvdW5kLG89InRvcCI9PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzP3RoaXMuYm9keS5kb20udG9wOnRoaXMuYm9keS5kb20uYm90dG9tLG49ZS5wYXJlbnROb2RlIT09bzt0aGlzLl9jYWxjdWxhdGVDaGFyU2l6ZSgpO3ZhciBzPXRoaXMub3B0aW9ucy5zaG93TWlub3JMYWJlbHMmJiJub25lIiE9PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzLHI9dGhpcy5vcHRpb25zLnNob3dNYWpvckxhYmVscyYmIm5vbmUiIT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXM7dC5taW5vckxhYmVsSGVpZ2h0PXM/dC5taW5vckNoYXJIZWlnaHQ6MCx0Lm1ham9yTGFiZWxIZWlnaHQ9cj90Lm1ham9yQ2hhckhlaWdodDowLHQuaGVpZ2h0PXQubWlub3JMYWJlbEhlaWdodCt0Lm1ham9yTGFiZWxIZWlnaHQsdC53aWR0aD1lLm9mZnNldFdpZHRoLHQubWlub3JMaW5lSGVpZ2h0PXRoaXMuYm9keS5kb21Qcm9wcy5yb290LmhlaWdodC10Lm1ham9yTGFiZWxIZWlnaHQtKCJ0b3AiPT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcz90aGlzLmJvZHkuZG9tUHJvcHMuYm90dG9tLmhlaWdodDp0aGlzLmJvZHkuZG9tUHJvcHMudG9wLmhlaWdodCksdC5taW5vckxpbmVXaWR0aD0xLHQubWFqb3JMaW5lSGVpZ2h0PXQubWlub3JMaW5lSGVpZ2h0K3QubWFqb3JMYWJlbEhlaWdodCx0Lm1ham9yTGluZVdpZHRoPTE7dmFyIGE9ZS5uZXh0U2libGluZyxoPWkubmV4dFNpYmxpbmc7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGkucGFyZW50Tm9kZSYmaS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpLGUuc3R5bGUuaGVpZ2h0PXRoaXMucHJvcHMuaGVpZ2h0KyJweCIsdGhpcy5fcmVwYWludExhYmVscygpLGE/by5pbnNlcnRCZWZvcmUoZSxhKTpvLmFwcGVuZENoaWxkKGUpLGg/dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuaW5zZXJ0QmVmb3JlKGksaCk6dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuYXBwZW5kQ2hpbGQoaSksdGhpcy5faXNSZXNpemVkKCl8fG59LG8ucHJvdG90eXBlLl9yZXBhaW50TGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXMsZT1yLmNvbnZlcnQodGhpcy5ib2R5LnJhbmdlLnN0YXJ0LCJOdW1iZXIiKSxpPXIuY29udmVydCh0aGlzLmJvZHkucmFuZ2UuZW5kLCJOdW1iZXIiKSxvPXRoaXMuYm9keS51dGlsLnRvVGltZSgodGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aHx8MTApKnRoaXMub3B0aW9ucy5tYXhNaW5vckNoYXJzKS52YWx1ZU9mKCksbj1vLWQuZ2V0SGlkZGVuRHVyYXRpb25CZWZvcmUodGhpcy5vcHRpb25zLm1vbWVudCx0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcy5ib2R5LnJhbmdlLG8pO24tPXRoaXMuYm9keS51dGlsLnRvVGltZSgwKS52YWx1ZU9mKCk7dmFyIHM9bmV3IGgobmV3IERhdGUoZSksbmV3IERhdGUoaSksbix0aGlzLmJvZHkuaGlkZGVuRGF0ZXMpO3Muc2V0TW9tZW50KHRoaXMub3B0aW9ucy5tb21lbnQpLHRoaXMub3B0aW9ucy5mb3JtYXQmJnMuc2V0Rm9ybWF0KHRoaXMub3B0aW9ucy5mb3JtYXQpLHRoaXMub3B0aW9ucy50aW1lQXhpcyYmcy5zZXRTY2FsZSh0aGlzLm9wdGlvbnMudGltZUF4aXMpLHRoaXMuc3RlcD1zO3ZhciBhPXRoaXMuZG9tO2EucmVkdW5kYW50LmxpbmVzPWEubGluZXMsYS5yZWR1bmRhbnQubWFqb3JUZXh0cz1hLm1ham9yVGV4dHMsYS5yZWR1bmRhbnQubWlub3JUZXh0cz1hLm1pbm9yVGV4dHMsYS5saW5lcz1bXSxhLm1ham9yVGV4dHM9W10sYS5taW5vclRleHRzPVtdO3ZhciBsLGMscCxmLG0sdixnLHksYixfPTAsdz12b2lkIDAseD0wO2ZvcihzLnN0YXJ0KCksbD1zLmdldEN1cnJlbnQoKSxwPXRoaXMuYm9keS51dGlsLnRvU2NyZWVuKGwpO3MuaGFzTmV4dCgpJiZ4PDFlMzspe3N3aXRjaCh4KyssZj1zLmlzTWFqb3IoKSxiPXMuZ2V0Q2xhc3NOYW1lKCkseT1zLmdldExhYmVsTWlub3IoKSxsLGM9cCxzLm5leHQoKSxsPXMuZ2V0Q3VycmVudCgpLHMuaXNNYWpvcigpLHA9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4obCksdj1fLF89cC1jLHMuc2NhbGUpe2Nhc2Uid2VlayI6bT0hMDticmVhaztkZWZhdWx0Om09Xz49LjQqdn1pZih0aGlzLm9wdGlvbnMuc2hvd01pbm9yTGFiZWxzJiZtKXt2YXIgaz10aGlzLl9yZXBhaW50TWlub3JUZXh0KGMseSx0LGIpO2suc3R5bGUud2lkdGg9XysicHgifWYmJnRoaXMub3B0aW9ucy5zaG93TWFqb3JMYWJlbHM/KGM+MCYmKHZvaWQgMD09dyYmKHc9Yyksaz10aGlzLl9yZXBhaW50TWFqb3JUZXh0KGMscy5nZXRMYWJlbE1ham9yKCksdCxiKSksZz10aGlzLl9yZXBhaW50TWFqb3JMaW5lKGMsXyx0LGIpKTptP2c9dGhpcy5fcmVwYWludE1pbm9yTGluZShjLF8sdCxiKTpnJiYoZy5zdHlsZS53aWR0aD1wYXJzZUludChnLnN0eWxlLndpZHRoKStfKyJweCIpfWlmKDFlMyE9PXh8fHV8fChjb25zb2xlLndhcm4oIlNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBUaW1lbGluZSBzY2FsZS4gTGltaXRlZCBkcmF3aW5nIG9mIGdyaWQgbGluZXMgdG8gMTAwMCBsaW5lcy4iKSx1PSEwKSx0aGlzLm9wdGlvbnMuc2hvd01ham9yTGFiZWxzKXt2YXIgTT10aGlzLmJvZHkudXRpbC50b1RpbWUoMCksUz1zLmdldExhYmVsTWFqb3IoTSksRD1TLmxlbmd0aCoodGhpcy5wcm9wcy5tYWpvckNoYXJXaWR0aHx8MTApKzEwOyh2b2lkIDA9PXd8fEQ8dykmJnRoaXMuX3JlcGFpbnRNYWpvclRleHQoMCxTLHQsYil9ci5mb3JFYWNoKHRoaXMuZG9tLnJlZHVuZGFudCxmdW5jdGlvbih0KXtmb3IoO3QubGVuZ3RoOyl7dmFyIGU9dC5wb3AoKTtlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX19KX0sby5wcm90b3R5cGUuX3JlcGFpbnRNaW5vclRleHQ9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49dGhpcy5kb20ucmVkdW5kYW50Lm1pbm9yVGV4dHMuc2hpZnQoKTtpZighbil7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksbi5hcHBlbmRDaGlsZChzKSx0aGlzLmRvbS5mb3JlZ3JvdW5kLmFwcGVuZENoaWxkKG4pfXJldHVybiB0aGlzLmRvbS5taW5vclRleHRzLnB1c2gobiksbi5pbm5lckhUTUw9ZSxuLnN0eWxlLnRvcD0idG9wIj09aT90aGlzLnByb3BzLm1ham9yTGFiZWxIZWlnaHQrInB4IjoiMCIsdGhpcy5vcHRpb25zLnJ0bD8obi5zdHlsZS5sZWZ0PSIiLG4uc3R5bGUucmlnaHQ9dCsicHgiKTpuLnN0eWxlLmxlZnQ9dCsicHgiLG4uY2xhc3NOYW1lPSJ2aXMtdGV4dCB2aXMtbWlub3IgIitvLG59LG8ucHJvdG90eXBlLl9yZXBhaW50TWFqb3JUZXh0PWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPXRoaXMuZG9tLnJlZHVuZGFudC5tYWpvclRleHRzLnNoaWZ0KCk7aWYoIW4pe3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksbi5hcHBlbmRDaGlsZChzKSx0aGlzLmRvbS5mb3JlZ3JvdW5kLmFwcGVuZENoaWxkKG4pfXJldHVybiBuLmNoaWxkTm9kZXNbMF0uaW5uZXJIVE1MPWUsbi5jbGFzc05hbWU9InZpcy10ZXh0IHZpcy1tYWpvciAiK28sbi5zdHlsZS50b3A9InRvcCI9PWk/IjAiOnRoaXMucHJvcHMubWlub3JMYWJlbEhlaWdodCsicHgiLHRoaXMub3B0aW9ucy5ydGw/KG4uc3R5bGUubGVmdD0iIixuLnN0eWxlLnJpZ2h0PXQrInB4Iik6bi5zdHlsZS5sZWZ0PXQrInB4Iix0aGlzLmRvbS5tYWpvclRleHRzLnB1c2gobiksbn0sby5wcm90b3R5cGUuX3JlcGFpbnRNaW5vckxpbmU9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49dGhpcy5kb20ucmVkdW5kYW50LmxpbmVzLnNoaWZ0KCk7bnx8KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uYmFja2dyb3VuZC5hcHBlbmRDaGlsZChuKSksdGhpcy5kb20ubGluZXMucHVzaChuKTt2YXIgcz10aGlzLnByb3BzO3JldHVybiBuLnN0eWxlLnRvcD0idG9wIj09aT9zLm1ham9yTGFiZWxIZWlnaHQrInB4Ijp0aGlzLmJvZHkuZG9tUHJvcHMudG9wLmhlaWdodCsicHgiLG4uc3R5bGUuaGVpZ2h0PXMubWlub3JMaW5lSGVpZ2h0KyJweCIsdGhpcy5vcHRpb25zLnJ0bD8obi5zdHlsZS5sZWZ0PSIiLG4uc3R5bGUucmlnaHQ9dC1zLm1pbm9yTGluZVdpZHRoLzIrInB4IixuLmNsYXNzTmFtZT0idmlzLWdyaWQgdmlzLXZlcnRpY2FsLXJ0bCB2aXMtbWlub3IgIitvKToobi5zdHlsZS5sZWZ0PXQtcy5taW5vckxpbmVXaWR0aC8yKyJweCIsbi5jbGFzc05hbWU9InZpcy1ncmlkIHZpcy12ZXJ0aWNhbCB2aXMtbWlub3IgIitvKSxuLnN0eWxlLndpZHRoPWUrInB4IixufSxvLnByb3RvdHlwZS5fcmVwYWludE1ham9yTGluZT1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbj10aGlzLmRvbS5yZWR1bmRhbnQubGluZXMuc2hpZnQoKTtufHwobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKG4pKSx0aGlzLmRvbS5saW5lcy5wdXNoKG4pO3ZhciBzPXRoaXMucHJvcHM7cmV0dXJuIG4uc3R5bGUudG9wPSJ0b3AiPT1pPyIwIjp0aGlzLmJvZHkuZG9tUHJvcHMudG9wLmhlaWdodCsicHgiLHRoaXMub3B0aW9ucy5ydGw/KG4uc3R5bGUubGVmdD0iIixuLnN0eWxlLnJpZ2h0PXQtcy5tYWpvckxpbmVXaWR0aC8yKyJweCIsbi5jbGFzc05hbWU9InZpcy1ncmlkIHZpcy12ZXJ0aWNhbC1ydGwgdmlzLW1ham9yICIrbyk6KG4uc3R5bGUubGVmdD10LXMubWFqb3JMaW5lV2lkdGgvMisicHgiLG4uY2xhc3NOYW1lPSJ2aXMtZ3JpZCB2aXMtdmVydGljYWwgdmlzLW1ham9yICIrbyksbi5zdHlsZS5oZWlnaHQ9cy5tYWpvckxpbmVIZWlnaHQrInB4IixuLnN0eWxlLndpZHRoPWUrInB4IixufSxvLnByb3RvdHlwZS5fY2FsY3VsYXRlQ2hhclNpemU9ZnVuY3Rpb24oKXt0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yfHwodGhpcy5kb20ubWVhc3VyZUNoYXJNaW5vcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yLmNsYXNzTmFtZT0idmlzLXRleHQgdmlzLW1pbm9yIHZpcy1tZWFzdXJlIix0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5kb20ubWVhc3VyZUNoYXJNaW5vci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiMCIpKSx0aGlzLmRvbS5mb3JlZ3JvdW5kLmFwcGVuZENoaWxkKHRoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3IpKSx0aGlzLnByb3BzLm1pbm9yQ2hhckhlaWdodD10aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yLmNsaWVudEhlaWdodCx0aGlzLnByb3BzLm1pbm9yQ2hhcldpZHRoPXRoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3IuY2xpZW50V2lkdGgsdGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvcnx8KHRoaXMuZG9tLm1lYXN1cmVDaGFyTWFqb3I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksdGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvci5jbGFzc05hbWU9InZpcy10ZXh0IHZpcy1tYWpvciB2aXMtbWVhc3VyZSIsdGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvci5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZG9tLm1lYXN1cmVDaGFyTWFqb3IuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjAiKSksdGhpcy5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yKSksdGhpcy5wcm9wcy5tYWpvckNoYXJIZWlnaHQ9dGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvci5jbGllbnRIZWlnaHQsdGhpcy5wcm9wcy5tYWpvckNoYXJXaWR0aD10aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLmNsaWVudFdpZHRofTt2YXIgdT0hMTt0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7dGhpcy5hY3RpdmU9ITEsdGhpcy5kb209e2NvbnRhaW5lcjp0fSx0aGlzLmRvbS5vdmVybGF5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLm92ZXJsYXkuY2xhc3NOYW1lPSJ2aXMtb3ZlcmxheSIsdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLm92ZXJsYXkpLHRoaXMuaGFtbWVyPWEodGhpcy5kb20ub3ZlcmxheSksdGhpcy5oYW1tZXIub24oInRhcCIsdGhpcy5fb25UYXBPdmVybGF5LmJpbmQodGhpcykpO3ZhciBlPXRoaXM7WyJ0YXAiLCJkb3VibGV0YXAiLCJwcmVzcyIsInBpbmNoIiwicGFuIiwicGFuc3RhcnQiLCJwYW5tb3ZlIiwicGFuZW5kIl0uZm9yRWFjaChmdW5jdGlvbih0KXtlLmhhbW1lci5vbih0LGZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9KX0pLGRvY3VtZW50JiZkb2N1bWVudC5ib2R5JiYodGhpcy5vbkNsaWNrPWZ1bmN0aW9uKGkpe24oaS50YXJnZXQsdCl8fGUuZGVhY3RpdmF0ZSgpfSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9uQ2xpY2spKSx2b2lkIDAhPT10aGlzLmtleWNoYXJtJiZ0aGlzLmtleWNoYXJtLmRlc3Ryb3koKSx0aGlzLmtleWNoYXJtPXMoKSx0aGlzLmVzY0xpc3RlbmVyPXRoaXMuZGVhY3RpdmF0ZS5iaW5kKHRoaXMpfWZ1bmN0aW9uIG4odCxlKXtmb3IoO3Q7KXtpZih0PT09ZSlyZXR1cm4hMDt0PXQucGFyZW50Tm9kZX1yZXR1cm4hMX12YXIgcz1pKDExNSkscj1pKDk5KSxhPWkoMTEyKSxoPWkoMSk7cihvLnByb3RvdHlwZSksby5jdXJyZW50PW51bGwsby5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZGVhY3RpdmF0ZSgpLHRoaXMuZG9tLm92ZXJsYXkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5vdmVybGF5KSx0aGlzLm9uQ2xpY2smJmRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub25DbGljayksdGhpcy5oYW1tZXIuZGVzdHJveSgpLHRoaXMuaGFtbWVyPW51bGx9LG8ucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKCl7by5jdXJyZW50JiZvLmN1cnJlbnQuZGVhY3RpdmF0ZSgpLG8uY3VycmVudD10aGlzLHRoaXMuYWN0aXZlPSEwLHRoaXMuZG9tLm92ZXJsYXkuc3R5bGUuZGlzcGxheT0ibm9uZSIsaC5hZGRDbGFzc05hbWUodGhpcy5kb20uY29udGFpbmVyLCJ2aXMtYWN0aXZlIiksdGhpcy5lbWl0KCJjaGFuZ2UiKSx0aGlzLmVtaXQoImFjdGl2YXRlIiksdGhpcy5rZXljaGFybS5iaW5kKCJlc2MiLHRoaXMuZXNjTGlzdGVuZXIpfSxvLnByb3RvdHlwZS5kZWFjdGl2YXRlPWZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9ITEsdGhpcy5kb20ub3ZlcmxheS5zdHlsZS5kaXNwbGF5PSIiLGgucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZG9tLmNvbnRhaW5lciwidmlzLWFjdGl2ZSIpLHRoaXMua2V5Y2hhcm0udW5iaW5kKCJlc2MiLHRoaXMuZXNjTGlzdGVuZXIpLHRoaXMuZW1pdCgiY2hhbmdlIiksdGhpcy5lbWl0KCJkZWFjdGl2YXRlIil9LG8ucHJvdG90eXBlLl9vblRhcE92ZXJsYXk9ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmF0ZSgpLHQuc3RvcFByb3BhZ2F0aW9uKCl9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuYm9keT10LHRoaXMuZGVmYXVsdE9wdGlvbnM9e21vbWVudDphLGxvY2FsZXM6aCxsb2NhbGU6ImVuIixpZDp2b2lkIDAsdGl0bGU6dm9pZCAwfSx0aGlzLm9wdGlvbnM9cy5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksZSYmZS50aW1lP3RoaXMuY3VzdG9tVGltZT1lLnRpbWU6dGhpcy5jdXN0b21UaW1lPW5ldyBEYXRlLHRoaXMuZXZlbnRQYXJhbXM9e30sdGhpcy5zZXRPcHRpb25zKGUpLHRoaXMuX2NyZWF0ZSgpfXZhciBuPWkoMTEyKSxzPWkoMSkscj1pKDEyMCksYT1pKDgyKSxoPWkoMTQyKTtvLnByb3RvdHlwZT1uZXcgcixvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJnMuc2VsZWN0aXZlRXh0ZW5kKFsibW9tZW50IiwibG9jYWxlIiwibG9jYWxlcyIsImlkIl0sdGhpcy5vcHRpb25zLHQpfSxvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmJvZHkucmFuZ2UuX29uTW91c2VXaGVlbCh0KX12YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlWyJjdXN0b20tdGltZSJdPXRoaXMsZS5jbGFzc05hbWU9InZpcy1jdXN0b20tdGltZSAiKyh0aGlzLm9wdGlvbnMuaWR8fCIiKSxlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS50b3A9IjBweCIsZS5zdHlsZS5oZWlnaHQ9IjEwMCUiLHRoaXMuYmFyPWU7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGkuc3R5bGUudG9wPSIwcHgiLGkuc3R5bGUubGVmdD0iLTEwcHgiLGkuc3R5bGUuaGVpZ2h0PSIxMDAlIixpLnN0eWxlLndpZHRoPSIyMHB4IixpLmFkZEV2ZW50TGlzdGVuZXI/KGkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsdC5iaW5kKHRoaXMpLCExKSxpLmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIix0LmJpbmQodGhpcyksITEpKTppLmF0dGFjaEV2ZW50KCJvbm1vdXNld2hlZWwiLHQuYmluZCh0aGlzKSksZS5hcHBlbmRDaGlsZChpKSx0aGlzLmhhbW1lcj1uZXcgbihpKSx0aGlzLmhhbW1lci5vbigicGFuc3RhcnQiLHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLm9uKCJwYW5tb3ZlIix0aGlzLl9vbkRyYWcuYmluZCh0aGlzKSksdGhpcy5oYW1tZXIub24oInBhbmVuZCIsdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLmdldCgicGFuIikuc2V0KHt0aHJlc2hvbGQ6NSxkaXJlY3Rpb246bi5ESVJFQ1RJT05fSE9SSVpPTlRBTH0pfSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5oaWRlKCksdGhpcy5oYW1tZXIuZGVzdHJveSgpLHRoaXMuaGFtbWVyPW51bGwsdGhpcy5ib2R5PW51bGx9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS5kb20uYmFja2dyb3VuZFZlcnRpY2FsO3RoaXMuYmFyLnBhcmVudE5vZGUhPXQmJih0aGlzLmJhci5wYXJlbnROb2RlJiZ0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKSx0LmFwcGVuZENoaWxkKHRoaXMuYmFyKSk7dmFyIGU9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4odGhpcy5jdXN0b21UaW1lKSxpPXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO2l8fCh0aGlzLndhcm5lZHx8KGNvbnNvbGUubG9nKCJXQVJOSU5HOiBvcHRpb25zLmxvY2FsZXNbJyIrdGhpcy5vcHRpb25zLmxvY2FsZSsiJ10gbm90IGZvdW5kLiBTZWUgaHR0cDovL3Zpc2pzLm9yZy9kb2NzL3RpbWVsaW5lLyNMb2NhbGl6YXRpb24iKSx0aGlzLndhcm5lZD0hMCksaT10aGlzLm9wdGlvbnMubG9jYWxlcy5lbik7dmFyIG89dGhpcy5vcHRpb25zLnRpdGxlO3JldHVybiB2b2lkIDA9PT1vPyhvPWkudGltZSsiOiAiK3RoaXMub3B0aW9ucy5tb21lbnQodGhpcy5jdXN0b21UaW1lKS5mb3JtYXQoImRkZGQsIE1NTU0gRG8gWVlZWSwgSDptbTpzcyIpLG89by5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStvLnN1YnN0cmluZygxKSk6ImZ1bmN0aW9uIj09dHlwZW9mIG8mJihvPW8uY2FsbCh0aGlzLmN1c3RvbVRpbWUpKSx0aGlzLmJhci5zdHlsZS5sZWZ0PWUrInB4Iix0aGlzLmJhci50aXRsZT1vLCExfSxvLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7dGhpcy5iYXIucGFyZW50Tm9kZSYmdGhpcy5iYXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmJhcil9LG8ucHJvdG90eXBlLnNldEN1c3RvbVRpbWU9ZnVuY3Rpb24odCl7dGhpcy5jdXN0b21UaW1lPXMuY29udmVydCh0LCJEYXRlIiksdGhpcy5yZWRyYXcoKX0sby5wcm90b3R5cGUuZ2V0Q3VzdG9tVGltZT1mdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZSh0aGlzLmN1c3RvbVRpbWUudmFsdWVPZigpKX0sby5wcm90b3R5cGUuc2V0Q3VzdG9tVGl0bGU9ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLnRpdGxlPXR9LG8ucHJvdG90eXBlLl9vbkRyYWdTdGFydD1mdW5jdGlvbih0KXt0aGlzLmV2ZW50UGFyYW1zLmRyYWdnaW5nPSEwLHRoaXMuZXZlbnRQYXJhbXMuY3VzdG9tVGltZT10aGlzLmN1c3RvbVRpbWUsdC5zdG9wUHJvcGFnYXRpb24oKX0sby5wcm90b3R5cGUuX29uRHJhZz1mdW5jdGlvbih0KXtpZih0aGlzLmV2ZW50UGFyYW1zLmRyYWdnaW5nKXt2YXIgZT10aGlzLmJvZHkudXRpbC50b1NjcmVlbih0aGlzLmV2ZW50UGFyYW1zLmN1c3RvbVRpbWUpK3QuZGVsdGFYLGk9dGhpcy5ib2R5LnV0aWwudG9UaW1lKGUpO3RoaXMuc2V0Q3VzdG9tVGltZShpKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJ0aW1lY2hhbmdlIix7aWQ6dGhpcy5vcHRpb25zLmlkLHRpbWU6bmV3IERhdGUodGhpcy5jdXN0b21UaW1lLnZhbHVlT2YoKSksZXZlbnQ6dH0pLHQuc3RvcFByb3BhZ2F0aW9uKCl9fSxvLnByb3RvdHlwZS5fb25EcmFnRW5kPWZ1bmN0aW9uKHQpe3RoaXMuZXZlbnRQYXJhbXMuZHJhZ2dpbmcmJih0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJ0aW1lY2hhbmdlZCIse2lkOnRoaXMub3B0aW9ucy5pZCx0aW1lOm5ldyBEYXRlKHRoaXMuY3VzdG9tVGltZS52YWx1ZU9mKCkpLGV2ZW50OnR9KSx0LnN0b3BQcm9wYWdhdGlvbigpKX0sby5jdXN0b21UaW1lRnJvbVRhcmdldD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC50YXJnZXQ7ZTspe2lmKGUuaGFzT3duUHJvcGVydHkoImN1c3RvbS10aW1lIikpcmV0dXJuIGVbImN1c3RvbS10aW1lIl07ZT1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUpe2UuZW49e2N1cnJlbnQ6ImN1cnJlbnQiLHRpbWU6InRpbWUifSxlLmVuX0VOPWUuZW4sZS5lbl9VUz1lLmVuLGUuaXQ9e2N1cnJlbnQ6ImF0dHVhbGUiLHRpbWU6InRlbXBvIn0sZS5pdF9JVD1lLml0LGUuaXRfQ0g9ZS5pdCxlLm5sPXtjdXJyZW50OiJodWlkaWdlIix0aW1lOiJ0aWpkIn0sZS5ubF9OTD1lLm5sLGUubmxfQkU9ZS5ubCxlLmRlPXtjdXJyZW50OiJBa3R1ZWxsZSIsdGltZToiWmVpdCJ9LGUuZGVfREU9ZS5kZSxlLmZyPXtjdXJyZW50OiJhY3R1ZWwiLHRpbWU6ImhldXJlIn0sZS5mcl9GUj1lLmZyLGUuZnJfQ0E9ZS5mcixlLmZyX0JFPWUuZnIsZS5lcz17Y3VycmVudDoiY29ycmllbnRlIix0aW1lOiJob3JhIn0sZS5lc19FUz1lLmVzfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuYm9keT10LHRoaXMuZGVmYXVsdE9wdGlvbnM9e3J0bDohMSxzaG93Q3VycmVudFRpbWU6ITAsbW9tZW50OnIsbG9jYWxlczphLGxvY2FsZToiZW4ifSx0aGlzLm9wdGlvbnM9bi5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5vZmZzZXQ9MCx0aGlzLl9jcmVhdGUoKSx0aGlzLnNldE9wdGlvbnMoZSl9dmFyIG49aSgxKSxzPWkoMTIwKSxyPWkoODIpLGE9aSgxNDIpO28ucHJvdG90eXBlPW5ldyBzLG8ucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0idmlzLWN1cnJlbnQtdGltZSIsdC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHQuc3R5bGUudG9wPSIwcHgiLHQuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLmJhcj10fSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnNob3dDdXJyZW50VGltZT0hMSx0aGlzLnJlZHJhdygpLHRoaXMuYm9keT1udWxsfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJm4uc2VsZWN0aXZlRXh0ZW5kKFsicnRsIiwic2hvd0N1cnJlbnRUaW1lIiwibW9tZW50IiwibG9jYWxlIiwibG9jYWxlcyJdLHRoaXMub3B0aW9ucyx0KX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLnNob3dDdXJyZW50VGltZSl7dmFyIHQ9dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kVmVydGljYWw7dGhpcy5iYXIucGFyZW50Tm9kZSE9dCYmKHRoaXMuYmFyLnBhcmVudE5vZGUmJnRoaXMuYmFyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5iYXIpLHQuYXBwZW5kQ2hpbGQodGhpcy5iYXIpLHRoaXMuc3RhcnQoKSk7dmFyIGU9dGhpcy5vcHRpb25zLm1vbWVudCgobmV3IERhdGUpLnZhbHVlT2YoKSt0aGlzLm9mZnNldCksaT10aGlzLmJvZHkudXRpbC50b1NjcmVlbihlKSxvPXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO298fCh0aGlzLndhcm5lZHx8KGNvbnNvbGUubG9nKCJXQVJOSU5HOiBvcHRpb25zLmxvY2FsZXNbJyIrdGhpcy5vcHRpb25zLmxvY2FsZSsiJ10gbm90IGZvdW5kLiBTZWUgaHR0cDovL3Zpc2pzLm9yZy9kb2NzL3RpbWVsaW5lLyNMb2NhbGl6YXRpb24iKSx0aGlzLndhcm5lZD0hMCksbz10aGlzLm9wdGlvbnMubG9jYWxlcy5lbik7dmFyIG49by5jdXJyZW50KyIgIitvLnRpbWUrIjogIitlLmZvcm1hdCgiZGRkZCwgTU1NTSBEbyBZWVlZLCBIOm1tOnNzIik7bj1uLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK24uc3Vic3RyaW5nKDEpLHRoaXMub3B0aW9ucy5ydGw/dGhpcy5iYXIuc3R5bGUucmlnaHQ9aSsicHgiOnRoaXMuYmFyLnN0eWxlLmxlZnQ9aSsicHgiLHRoaXMuYmFyLnRpdGxlPW59ZWxzZSB0aGlzLmJhci5wYXJlbnROb2RlJiZ0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKSx0aGlzLnN0b3AoKTtyZXR1cm4hMX0sby5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ZS5zdG9wKCk7dmFyIGk9ZS5ib2R5LnJhbmdlLmNvbnZlcnNpb24oZS5ib2R5LmRvbVByb3BzLmNlbnRlci53aWR0aCkuc2NhbGUsbz0xL2kvMTA7bzwzMCYmKG89MzApLG8+MWUzJiYobz0xZTMpLGUucmVkcmF3KCksZS5ib2R5LmVtaXR0ZXIuZW1pdCgiY3VycmVudFRpbWVUaWNrIiksZS5jdXJyZW50VGltZVRpbWVyPXNldFRpbWVvdXQodCxvKX12YXIgZT10aGlzO3QoKX0sby5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMuY3VycmVudFRpbWVUaW1lciYmKGNsZWFyVGltZW91dCh0aGlzLmN1cnJlbnRUaW1lVGltZXIpLGRlbGV0ZSB0aGlzLmN1cnJlbnRUaW1lVGltZXIpfSxvLnByb3RvdHlwZS5zZXRDdXJyZW50VGltZT1mdW5jdGlvbih0KXt2YXIgZT1uLmNvbnZlcnQodCwiRGF0ZSIpLnZhbHVlT2YoKSxpPShuZXcgRGF0ZSkudmFsdWVPZigpO3RoaXMub2Zmc2V0PWUtaSx0aGlzLnJlZHJhdygpfSxvLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZSgobmV3IERhdGUpLnZhbHVlT2YoKSt0aGlzLm9mZnNldCl9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUucHJpbnRTdHlsZT12b2lkIDA7dmFyIG49aSg5MCkscz1vKG4pLHI9aSg2MiksYT1vKHIpLGg9aSg1OCksZD1vKGgpLGw9aSgxMzQpLHU9byhsKSxjPWkoMTM1KSxwPW8oYyksZj1pKDEpLG09ITEsdj12b2lkIDAsZz0iYmFja2dyb3VuZDogI0ZGZWVlZTsgY29sb3I6ICNkZDAwMDAiLHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7KDAsdS5kZWZhdWx0KSh0aGlzLHQpfXJldHVybigwLHAuZGVmYXVsdCkodCxudWxsLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8pe209ITEsdj1pO3ZhciBuPWk7cmV0dXJuIHZvaWQgMCE9PW8mJihuPWlbb10pLHQucGFyc2UoZSxuLFtdKSxtfX0se2tleToicGFyc2UiLHZhbHVlOmZ1bmN0aW9uKGUsaSxvKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiZ0LmNoZWNrKG4sZSxpLG8pfX0se2tleToiY2hlY2siLHZhbHVlOmZ1bmN0aW9uKGUsaSxvLG4pe3ZvaWQgMD09PW9bZV0mJnZvaWQgMD09PW8uX19hbnlfXz90LmdldFN1Z2dlc3Rpb24oZSxvLG4pOnZvaWQgMD09PW9bZV0mJnZvaWQgMCE9PW8uX19hbnlfXz8ib2JqZWN0Ij09PXQuZ2V0VHlwZShpW2VdKSYmdm9pZCAwIT09by5fX2FueV9fLl9fdHlwZV9fP3QuY2hlY2tGaWVsZHMoZSxpLG8sIl9fYW55X18iLG8uX19hbnlfXy5fX3R5cGVfXyxuKTp0LmNoZWNrRmllbGRzKGUsaSxvLCJfX2FueV9fIixvLl9fYW55X18sbik6dm9pZCAwIT09b1tlXS5fX3R5cGVfXz90LmNoZWNrRmllbGRzKGUsaSxvLGUsb1tlXS5fX3R5cGVfXyxuKTp0LmNoZWNrRmllbGRzKGUsaSxvLGUsb1tlXSxuKX19LHtrZXk6ImNoZWNrRmllbGRzIix2YWx1ZTpmdW5jdGlvbihlLGksbyxuLHMscil7dmFyIGE9dC5nZXRUeXBlKGlbZV0pLGg9c1thXTt2b2lkIDAhPT1oPyJhcnJheSI9PT10LmdldFR5cGUoaCkmJi0xPT09aC5pbmRleE9mKGlbZV0pPyhjb25zb2xlLmxvZygnJWNJbnZhbGlkIG9wdGlvbiBkZXRlY3RlZCBpbiAiJytlKyciLiBBbGxvd2VkIHZhbHVlcyBhcmU6Jyt0LnByaW50KGgpKycgbm90ICInK2lbZV0rJyIuICcrdC5wcmludExvY2F0aW9uKHIsZSksZyksbT0hMCk6Im9iamVjdCI9PT1hJiYiX19hbnlfXyIhPT1uJiYocj1mLmNvcHlBbmRFeHRlbmRBcnJheShyLGUpLHQucGFyc2UoaVtlXSxvW25dLHIpKTp2b2lkIDA9PT1zLmFueSYmKGNvbnNvbGUubG9nKCclY0ludmFsaWQgdHlwZSByZWNlaXZlZCBmb3IgIicrZSsnIi4gRXhwZWN0ZWQ6ICcrdC5wcmludCgoMCxkLmRlZmF1bHQpKHMpKSsiLiBSZWNlaXZlZCBbIithKyddICInK2lbZV0rJyInK3QucHJpbnRMb2NhdGlvbihyLGUpLGcpLG09ITApfX0se2tleToiZ2V0VHlwZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwPT09dD8idW5kZWZpbmVkIjooMCxhLmRlZmF1bHQpKHQpO3JldHVybiJvYmplY3QiPT09ZT9udWxsPT09dD8ibnVsbCI6dCBpbnN0YW5jZW9mIEJvb2xlYW4/ImJvb2xlYW4iOnQgaW5zdGFuY2VvZiBOdW1iZXI/Im51bWJlciI6dCBpbnN0YW5jZW9mIFN0cmluZz8ic3RyaW5nIjpBcnJheS5pc0FycmF5KHQpPyJhcnJheSI6dCBpbnN0YW5jZW9mIERhdGU/ImRhdGUiOnZvaWQgMCE9PXQubm9kZVR5cGU/ImRvbSI6ITA9PT10Ll9pc0FNb21lbnRPYmplY3Q/Im1vbWVudCI6Im9iamVjdCI6Im51bWJlciI9PT1lPyJudW1iZXIiOiJib29sZWFuIj09PWU/ImJvb2xlYW4iOiJzdHJpbmciPT09ZT8ic3RyaW5nIjp2b2lkIDA9PT1lPyJ1bmRlZmluZWQiOmV9fSx7a2V5OiJnZXRTdWdnZXN0aW9uIix2YWx1ZTpmdW5jdGlvbihlLGksbyl7dmFyIG49dC5maW5kSW5PcHRpb25zKGUsaSxvLCExKSxzPXQuZmluZEluT3B0aW9ucyhlLHYsW10sITApO3ZvaWQgMCE9PW4uaW5kZXhNYXRjaD9jb25zb2xlLmxvZygnJWNVbmtub3duIG9wdGlvbiBkZXRlY3RlZDogIicrZSsnIiBpbiAnK3QucHJpbnRMb2NhdGlvbihuLnBhdGgsZSwiIikrJ1BlcmhhcHMgaXQgd2FzIGluY29tcGxldGU/IERpZCB5b3UgbWVhbjogIicrbi5pbmRleE1hdGNoKyciP1xuXG4nLGcpOnMuZGlzdGFuY2U8PTQmJm4uZGlzdGFuY2U+cy5kaXN0YW5jZT9jb25zb2xlLmxvZygnJWNVbmtub3duIG9wdGlvbiBkZXRlY3RlZDogIicrZSsnIiBpbiAnK3QucHJpbnRMb2NhdGlvbihuLnBhdGgsZSwiIikrIlBlcmhhcHMgaXQgd2FzIG1pc3BsYWNlZD8gTWF0Y2hpbmcgb3B0aW9uIGZvdW5kIGF0OiAiK3QucHJpbnRMb2NhdGlvbihzLnBhdGgscy5jbG9zZXN0TWF0Y2gsIiIpLGcpOm4uZGlzdGFuY2U8PTg/Y29uc29sZS5sb2coJyVjVW5rbm93biBvcHRpb24gZGV0ZWN0ZWQ6ICInK2UrJyIuIERpZCB5b3UgbWVhbiAiJytuLmNsb3Nlc3RNYXRjaCsnIj8nK3QucHJpbnRMb2NhdGlvbihuLnBhdGgsZSksZyk6Y29uc29sZS5sb2coJyVjVW5rbm93biBvcHRpb24gZGV0ZWN0ZWQ6ICInK2UrJyIuIERpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U6ICcrdC5wcmludCgoMCxkLmRlZmF1bHQpKGkpKSt0LnByaW50TG9jYXRpb24obyxlKSxnKSxtPSEwfX0se2tleToiZmluZEluT3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8pe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM10scz0xZTkscj0iIixhPVtdLGg9ZS50b0xvd2VyQ2FzZSgpLGQ9dm9pZCAwO2Zvcih2YXIgbCBpbiBpKXt2YXIgdT12b2lkIDA7aWYodm9pZCAwIT09aVtsXS5fX3R5cGVfXyYmITA9PT1uKXt2YXIgYz10LmZpbmRJbk9wdGlvbnMoZSxpW2xdLGYuY29weUFuZEV4dGVuZEFycmF5KG8sbCkpO3M+Yy5kaXN0YW5jZSYmKHI9Yy5jbG9zZXN0TWF0Y2gsYT1jLnBhdGgscz1jLmRpc3RhbmNlLGQ9Yy5pbmRleE1hdGNoKX1lbHNlLTEhPT1sLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihoKSYmKGQ9bCksdT10LmxldmVuc2h0ZWluRGlzdGFuY2UoZSxsKSxzPnUmJihyPWwsYT1mLmNvcHlBcnJheShvKSxzPXUpfXJldHVybntjbG9zZXN0TWF0Y2g6cixwYXRoOmEsZGlzdGFuY2U6cyxpbmRleE1hdGNoOmR9fX0se2tleToicHJpbnRMb2NhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOiJQcm9ibGVtIHZhbHVlIGZvdW5kIGF0OiBcbiIsbz0iXG5cbiIraSsib3B0aW9ucyA9IHtcbiIsbj0wO248dC5sZW5ndGg7bisrKXtmb3IodmFyIHM9MDtzPG4rMTtzKyspbys9IiAgIjtvKz10W25dKyI6IHtcbiJ9Zm9yKHZhciByPTA7cjx0Lmxlbmd0aCsxO3IrKylvKz0iICAiO28rPWUrIlxuIjtmb3IodmFyIGE9MDthPHQubGVuZ3RoKzE7YSsrKXtmb3IodmFyIGg9MDtoPHQubGVuZ3RoLWE7aCsrKW8rPSIgICI7bys9In1cbiJ9cmV0dXJuIG8rIlxuXG4ifX0se2tleToicHJpbnQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybigwLHMuZGVmYXVsdCkodCkucmVwbGFjZSgvKFwiKXwoXFspfChcXSl8KCwiX190eXBlX18iKS9nLCIiKS5yZXBsYWNlKC8oXCwpL2csIiwgIil9fSx7a2V5OiJsZXZlbnNodGVpbkRpc3RhbmNlIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gZS5sZW5ndGg7aWYoMD09PWUubGVuZ3RoKXJldHVybiB0Lmxlbmd0aDt2YXIgaSxvPVtdO2ZvcihpPTA7aTw9ZS5sZW5ndGg7aSsrKW9baV09W2ldO3ZhciBuO2ZvcihuPTA7bjw9dC5sZW5ndGg7bisrKW9bMF1bbl09bjtmb3IoaT0xO2k8PWUubGVuZ3RoO2krKylmb3Iobj0xO248PXQubGVuZ3RoO24rKyllLmNoYXJBdChpLTEpPT10LmNoYXJBdChuLTEpP29baV1bbl09b1tpLTFdW24tMV06b1tpXVtuXT1NYXRoLm1pbihvW2ktMV1bbi0xXSsxLE1hdGgubWluKG9baV1bbi0xXSsxLG9baS0xXVtuXSsxKSk7cmV0dXJuIG9bZS5sZW5ndGhdW3QubGVuZ3RoXX19XSksdH0oKTtlLmRlZmF1bHQ9eSxlLnByaW50U3R5bGU9Z30sZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9InN0cmluZyIsbz0iYm9vbGVhbiIsbj0ibnVtYmVyIixzPSJvYmplY3QiLHI9e2NvbmZpZ3VyZTp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxmaWx0ZXI6e2Jvb2xlYW46byxmdW5jdGlvbjoiZnVuY3Rpb24ifSxjb250YWluZXI6e2RvbToiZG9tIn0sX190eXBlX186e29iamVjdDpzLGJvb2xlYW46byxmdW5jdGlvbjoiZnVuY3Rpb24ifX0sYWxpZ246e3N0cmluZzppfSxydGw6e2Jvb2xlYW46byx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHJvbGxpbmdNb2RlOntmb2xsb3c6e2Jvb2xlYW46b30sb2Zmc2V0OntudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntvYmplY3Q6c319LHZlcnRpY2FsU2Nyb2xsOntib29sZWFuOm8sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxob3Jpem9udGFsU2Nyb2xsOntib29sZWFuOm8sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxhdXRvUmVzaXplOntib29sZWFuOm99LHRocm90dGxlUmVkcmF3OntudW1iZXI6bn0sY2xpY2tUb1VzZTp7Ym9vbGVhbjpvfSxkYXRhQXR0cmlidXRlczp7c3RyaW5nOmksYXJyYXk6ImFycmF5In0sZWRpdGFibGU6e2FkZDp7Ym9vbGVhbjpvLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0scmVtb3ZlOntib29sZWFuOm8sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx1cGRhdGVHcm91cDp7Ym9vbGVhbjpvLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sdXBkYXRlVGltZTp7Ym9vbGVhbjpvLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sb3ZlcnJpZGVJdGVtczp7Ym9vbGVhbjpvLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sX190eXBlX186e2Jvb2xlYW46byxvYmplY3Q6c319LGVuZDp7bnVtYmVyOm4sZGF0ZToiZGF0ZSIsc3RyaW5nOmksbW9tZW50OiJtb21lbnQifSxmb3JtYXQ6e21pbm9yTGFiZWxzOnttaWxsaXNlY29uZDp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxzZWNvbmQ6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sbWludXRlOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LGhvdXI6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sd2Vla2RheTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxkYXk6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sd2Vlazp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxtb250aDp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx5ZWFyOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntvYmplY3Q6cyxmdW5jdGlvbjoiZnVuY3Rpb24ifX0sbWFqb3JMYWJlbHM6e21pbGxpc2Vjb25kOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHNlY29uZDp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxtaW51dGU6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0saG91cjp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx3ZWVrZGF5OntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LGRheTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx3ZWVrOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LG1vbnRoOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHllYXI6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sX190eXBlX186e29iamVjdDpzLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9fSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxtb21lbnQ6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LGdyb3VwT3JkZXI6e3N0cmluZzppLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9LGdyb3VwRWRpdGFibGU6e2FkZDp7Ym9vbGVhbjpvLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0scmVtb3ZlOntib29sZWFuOm8sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxvcmRlcjp7Ym9vbGVhbjpvLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sX190eXBlX186e2Jvb2xlYW46byxvYmplY3Q6c319LGdyb3VwT3JkZXJTd2FwOntmdW5jdGlvbjoiZnVuY3Rpb24ifSxoZWlnaHQ6e3N0cmluZzppLG51bWJlcjpufSxoaWRkZW5EYXRlczp7c3RhcnQ6e2RhdGU6ImRhdGUiLG51bWJlcjpuLHN0cmluZzppLG1vbWVudDoibW9tZW50In0sZW5kOntkYXRlOiJkYXRlIixudW1iZXI6bixzdHJpbmc6aSxtb21lbnQ6Im1vbWVudCJ9LHJlcGVhdDp7c3RyaW5nOml9LF9fdHlwZV9fOntvYmplY3Q6cyxhcnJheToiYXJyYXkifX0saXRlbXNBbHdheXNEcmFnZ2FibGU6e2Jvb2xlYW46b30sbG9jYWxlOntzdHJpbmc6aX0sbG9jYWxlczp7X19hbnlfXzp7YW55OiJhbnkifSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxtYXJnaW46e2F4aXM6e251bWJlcjpufSxpdGVtOntob3Jpem9udGFsOntudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHZlcnRpY2FsOntudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntvYmplY3Q6cyxudW1iZXI6bn19LF9fdHlwZV9fOntvYmplY3Q6cyxudW1iZXI6bn19LG1heDp7ZGF0ZToiZGF0ZSIsbnVtYmVyOm4sc3RyaW5nOmksbW9tZW50OiJtb21lbnQifSxtYXhIZWlnaHQ6e251bWJlcjpuLHN0cmluZzppfSxtYXhNaW5vckNoYXJzOntudW1iZXI6bn0sbWluOntkYXRlOiJkYXRlIixudW1iZXI6bixzdHJpbmc6aSxtb21lbnQ6Im1vbWVudCJ9LG1pbkhlaWdodDp7bnVtYmVyOm4sc3RyaW5nOml9LG1vdmVhYmxlOntib29sZWFuOm99LG11bHRpc2VsZWN0Ontib29sZWFuOm99LG11bHRpc2VsZWN0UGVyR3JvdXA6e2Jvb2xlYW46b30sb25BZGQ6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LG9uVXBkYXRlOntmdW5jdGlvbjoiZnVuY3Rpb24ifSxvbk1vdmU6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LG9uTW92aW5nOntmdW5jdGlvbjoiZnVuY3Rpb24ifSxvblJlbW92ZTp7ZnVuY3Rpb246ImZ1bmN0aW9uIn0sb25BZGRHcm91cDp7ZnVuY3Rpb246ImZ1bmN0aW9uIn0sb25Nb3ZlR3JvdXA6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LG9uUmVtb3ZlR3JvdXA6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LG9yZGVyOntmdW5jdGlvbjoiZnVuY3Rpb24ifSxvcmllbnRhdGlvbjp7YXhpczp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxpdGVtOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntzdHJpbmc6aSxvYmplY3Q6c319LHNlbGVjdGFibGU6e2Jvb2xlYW46b30sc2hvd0N1cnJlbnRUaW1lOntib29sZWFuOm99LHNob3dNYWpvckxhYmVsczp7Ym9vbGVhbjpvfSxzaG93TWlub3JMYWJlbHM6e2Jvb2xlYW46b30sc3RhY2s6e2Jvb2xlYW46b30sc3RhY2tTdWJncm91cHM6e2Jvb2xlYW46b30sc25hcDp7ZnVuY3Rpb246ImZ1bmN0aW9uIixudWxsOiJudWxsIn0sc3RhcnQ6e2RhdGU6ImRhdGUiLG51bWJlcjpuLHN0cmluZzppLG1vbWVudDoibW9tZW50In0sdGVtcGxhdGU6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LGdyb3VwVGVtcGxhdGU6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LHZpc2libGVGcmFtZVRlbXBsYXRlOntzdHJpbmc6aSxmdW5jdGlvbjoiZnVuY3Rpb24ifSxzaG93VG9vbHRpcHM6e2Jvb2xlYW46b30sdG9vbHRpcDp7Zm9sbG93TW91c2U6e2Jvb2xlYW46b30sb3ZlcmZsb3dNZXRob2Q6e3N0cmluZzpbImNhcCIsImZsaXAiXX0sX190eXBlX186e29iamVjdDpzfX0sdG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWU6e3RlbXBsYXRlOntmdW5jdGlvbjoiZnVuY3Rpb24ifSxfX3R5cGVfXzp7Ym9vbGVhbjpvLG9iamVjdDpzfX0sdGltZUF4aXM6e3NjYWxlOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHN0ZXA6e251bWJlcjpuLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sX190eXBlX186e29iamVjdDpzfX0sdHlwZTp7c3RyaW5nOml9LHdpZHRoOntzdHJpbmc6aSxudW1iZXI6bn0sem9vbWFibGU6e2Jvb2xlYW46b30sem9vbUtleTp7c3RyaW5nOlsiY3RybEtleSIsImFsdEtleSIsIm1ldGFLZXkiLCIiXX0sem9vbU1heDp7bnVtYmVyOm59LHpvb21NaW46e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxhPXtnbG9iYWw6e2FsaWduOlsiY2VudGVyIiwibGVmdCIsInJpZ2h0Il0sZGlyZWN0aW9uOiExLGF1dG9SZXNpemU6ITAsY2xpY2tUb1VzZTohMSxlZGl0YWJsZTp7YWRkOiExLHJlbW92ZTohMSx1cGRhdGVHcm91cDohMSx1cGRhdGVUaW1lOiExfSxlbmQ6IiIsZm9ybWF0OnttaW5vckxhYmVsczp7bWlsbGlzZWNvbmQ6IlNTUyIsc2Vjb25kOiJzIixtaW51dGU6IkhIOm1tIixob3VyOiJISDptbSIsd2Vla2RheToiZGRkIEQiLGRheToiRCIsd2VlazoidyIsbW9udGg6Ik1NTSIseWVhcjoiWVlZWSJ9LG1ham9yTGFiZWxzOnttaWxsaXNlY29uZDoiSEg6bW06c3MiLHNlY29uZDoiRCBNTU1NIEhIOm1tIixtaW51dGU6ImRkZCBEIE1NTU0iLGhvdXI6ImRkZCBEIE1NTU0iLHdlZWtkYXk6Ik1NTU0gWVlZWSIsZGF5OiJNTU1NIFlZWVkiLHdlZWs6Ik1NTU0gWVlZWSIsbW9udGg6IllZWVkiLHllYXI6IiJ9fSxncm91cHNEcmFnZ2FibGU6ITEsaGVpZ2h0OiIiLGxvY2FsZToiIixtYXJnaW46e2F4aXM6WzIwLDAsMTAwLDFdLGl0ZW06e2hvcml6b250YWw6WzEwLDAsMTAwLDFdLHZlcnRpY2FsOlsxMCwwLDEwMCwxXX19LG1heDoiIixtYXhIZWlnaHQ6IiIsbWF4TWlub3JDaGFyczpbNywwLDIwLDFdLG1pbjoiIixtaW5IZWlnaHQ6IiIsbW92ZWFibGU6ITEsbXVsdGlzZWxlY3Q6ITEsbXVsdGlzZWxlY3RQZXJHcm91cDohMSxvcmllbnRhdGlvbjp7YXhpczpbImJvdGgiLCJib3R0b20iLCJ0b3AiXSxpdGVtOlsiYm90dG9tIiwidG9wIl19LHNlbGVjdGFibGU6ITAsc2hvd0N1cnJlbnRUaW1lOiExLHNob3dNYWpvckxhYmVsczohMCxzaG93TWlub3JMYWJlbHM6ITAsc3RhY2s6ITAsc3RhY2tTdWJncm91cHM6ITAsc3RhcnQ6IiIsc2hvd1Rvb2x0aXBzOiEwLHRvb2x0aXA6e2ZvbGxvd01vdXNlOiExLG92ZXJmbG93TWV0aG9kOiJmbGlwIn0sdG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWU6ITEsdHlwZTpbImJveCIsInBvaW50IiwicmFuZ2UiLCJiYWNrZ3JvdW5kIl0sd2lkdGg6IjEwMCUiLHpvb21hYmxlOiEwLHpvb21LZXk6WyJjdHJsS2V5IiwiYWx0S2V5IiwibWV0YUtleSIsIiJdLHpvb21NYXg6WzMxNTM2ZTEwLDEwLDMxNTM2ZTEwLDFdLHpvb21NaW46WzEwLDEwLDMxNTM2ZTEwLDFdfX07ZS5hbGxPcHRpb25zPXIsZS5jb25maWd1cmVPcHRpb25zPWF9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSg5MCkscz1vKG4pLHI9aSg2MiksYT1vKHIpLGg9aSgxMzQpLGQ9byhoKSxsPWkoMTM1KSx1PW8obCksYz1pKDEpLHA9aSgxNDcpLmRlZmF1bHQsZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8pe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXToxOygwLGQuZGVmYXVsdCkodGhpcyx0KSx0aGlzLnBhcmVudD1lLHRoaXMuY2hhbmdlZE9wdGlvbnM9W10sdGhpcy5jb250YWluZXI9aSx0aGlzLmFsbG93Q3JlYXRpb249ITEsdGhpcy5vcHRpb25zPXt9LHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5wb3B1cENvdW50ZXI9MCx0aGlzLmRlZmF1bHRPcHRpb25zPXtlbmFibGVkOiExLGZpbHRlcjohMCxjb250YWluZXI6dm9pZCAwLHNob3dCdXR0b246ITB9LGMuZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmNvbmZpZ3VyZU9wdGlvbnM9byx0aGlzLm1vZHVsZU9wdGlvbnM9e30sdGhpcy5kb21FbGVtZW50cz1bXSx0aGlzLnBvcHVwRGl2PXt9LHRoaXMucG9wdXBMaW1pdD01LHRoaXMucG9wdXBIaXN0b3J5PXt9LHRoaXMuY29sb3JQaWNrZXI9bmV3IHAobiksdGhpcy53cmFwcGVyPXZvaWQgMH1yZXR1cm4oMCx1LmRlZmF1bHQpKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3RoaXMucG9wdXBIaXN0b3J5PXt9LHRoaXMuX3JlbW92ZVBvcHVwKCk7dmFyIGU9ITA7InN0cmluZyI9PXR5cGVvZiB0P3RoaXMub3B0aW9ucy5maWx0ZXI9dDp0IGluc3RhbmNlb2YgQXJyYXk/dGhpcy5vcHRpb25zLmZpbHRlcj10LmpvaW4oKToib2JqZWN0Ij09PSh2b2lkIDA9PT10PyJ1bmRlZmluZWQiOigwLGEuZGVmYXVsdCkodCkpPyh2b2lkIDAhPT10LmNvbnRhaW5lciYmKHRoaXMub3B0aW9ucy5jb250YWluZXI9dC5jb250YWluZXIpLHZvaWQgMCE9PXQuZmlsdGVyJiYodGhpcy5vcHRpb25zLmZpbHRlcj10LmZpbHRlciksdm9pZCAwIT09dC5zaG93QnV0dG9uJiYodGhpcy5vcHRpb25zLnNob3dCdXR0b249dC5zaG93QnV0dG9uKSx2b2lkIDAhPT10LmVuYWJsZWQmJihlPXQuZW5hYmxlZCkpOiJib29sZWFuIj09dHlwZW9mIHQ/KHRoaXMub3B0aW9ucy5maWx0ZXI9ITAsZT10KToiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHRoaXMub3B0aW9ucy5maWx0ZXI9dCxlPSEwKSwhMT09PXRoaXMub3B0aW9ucy5maWx0ZXImJihlPSExKSx0aGlzLm9wdGlvbnMuZW5hYmxlZD1lfXRoaXMuX2NsZWFuKCl9fSx7a2V5OiJzZXRNb2R1bGVPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm1vZHVsZU9wdGlvbnM9dCwhMD09PXRoaXMub3B0aW9ucy5lbmFibGVkJiYodGhpcy5fY2xlYW4oKSx2b2lkIDAhPT10aGlzLm9wdGlvbnMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9dGhpcy5vcHRpb25zLmNvbnRhaW5lciksdGhpcy5fY3JlYXRlKCkpfX0se2tleToiX2NyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2NsZWFuKCksdGhpcy5jaGFuZ2VkT3B0aW9ucz1bXTt2YXIgZT10aGlzLm9wdGlvbnMuZmlsdGVyLGk9MCxvPSExO2Zvcih2YXIgbiBpbiB0aGlzLmNvbmZpZ3VyZU9wdGlvbnMpdGhpcy5jb25maWd1cmVPcHRpb25zLmhhc093blByb3BlcnR5KG4pJiYodGhpcy5hbGxvd0NyZWF0aW9uPSExLG89ITEsImZ1bmN0aW9uIj09dHlwZW9mIGU/KG89ZShuLFtdKSxvPW98fHRoaXMuX2hhbmRsZU9iamVjdCh0aGlzLmNvbmZpZ3VyZU9wdGlvbnNbbl0sW25dLCEwKSk6ITAhPT1lJiYtMT09PWUuaW5kZXhPZihuKXx8KG89ITApLCExIT09byYmKHRoaXMuYWxsb3dDcmVhdGlvbj0hMCxpPjAmJnRoaXMuX21ha2VJdGVtKFtdKSx0aGlzLl9tYWtlSGVhZGVyKG4pLHRoaXMuX2hhbmRsZU9iamVjdCh0aGlzLmNvbmZpZ3VyZU9wdGlvbnNbbl0sW25dKSksaSsrKTtpZighMD09PXRoaXMub3B0aW9ucy5zaG93QnV0dG9uKXt2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtzLmNsYXNzTmFtZT0idmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1idXR0b24iLHMuaW5uZXJIVE1MPSJnZW5lcmF0ZSBvcHRpb25zIixzLm9uY2xpY2s9ZnVuY3Rpb24oKXt0Ll9wcmludE9wdGlvbnMoKX0scy5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpe3MuY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWJ1dHRvbiBob3ZlciJ9LHMub25tb3VzZW91dD1mdW5jdGlvbigpe3MuY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWJ1dHRvbiJ9LAp0aGlzLm9wdGlvbnNDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5vcHRpb25zQ29udGFpbmVyLmNsYXNzTmFtZT0idmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1vcHRpb24tY29udGFpbmVyIix0aGlzLmRvbUVsZW1lbnRzLnB1c2godGhpcy5vcHRpb25zQ29udGFpbmVyKSx0aGlzLmRvbUVsZW1lbnRzLnB1c2gocyl9dGhpcy5fcHVzaCgpfX0se2tleToiX3B1c2giLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy53cmFwcGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMud3JhcHBlci5jbGFzc05hbWU9InZpcy1jb25maWd1cmF0aW9uLXdyYXBwZXIiLHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMud3JhcHBlcik7Zm9yKHZhciB0PTA7dDx0aGlzLmRvbUVsZW1lbnRzLmxlbmd0aDt0KyspdGhpcy53cmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuZG9tRWxlbWVudHNbdF0pO3RoaXMuX3Nob3dQb3B1cElmTmVlZGVkKCl9fSx7a2V5OiJfY2xlYW4iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLmRvbUVsZW1lbnRzLmxlbmd0aDt0KyspdGhpcy53cmFwcGVyLnJlbW92ZUNoaWxkKHRoaXMuZG9tRWxlbWVudHNbdF0pO3ZvaWQgMCE9PXRoaXMud3JhcHBlciYmKHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMud3JhcHBlciksdGhpcy53cmFwcGVyPXZvaWQgMCksdGhpcy5kb21FbGVtZW50cz1bXSx0aGlzLl9yZW1vdmVQb3B1cCgpfX0se2tleToiX2dldFZhbHVlIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5tb2R1bGVPcHRpb25zLGk9MDtpPHQubGVuZ3RoO2krKyl7aWYodm9pZCAwPT09ZVt0W2ldXSl7ZT12b2lkIDA7YnJlYWt9ZT1lW3RbaV1dfXJldHVybiBlfX0se2tleToiX21ha2VJdGVtIix2YWx1ZTpmdW5jdGlvbih0KXtpZighMD09PXRoaXMuYWxsb3dDcmVhdGlvbil7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc05hbWU9InZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctaXRlbSB2aXMtY29uZmlnLXMiK3QubGVuZ3RoO2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLG89QXJyYXkoaT4xP2ktMTowKSxuPTE7bjxpO24rKylvW24tMV09YXJndW1lbnRzW25dO3JldHVybiBvLmZvckVhY2goZnVuY3Rpb24odCl7ZS5hcHBlbmRDaGlsZCh0KX0pLHRoaXMuZG9tRWxlbWVudHMucHVzaChlKSx0aGlzLmRvbUVsZW1lbnRzLmxlbmd0aH1yZXR1cm4gMH19LHtrZXk6Il9tYWtlSGVhZGVyIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTmFtZT0idmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1oZWFkZXIiLGUuaW5uZXJIVE1MPXQsdGhpcy5fbWFrZUl0ZW0oW10sZSl9fSx7a2V5OiJfbWFrZUxhYmVsIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0sbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gby5jbGFzc05hbWU9InZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctbGFiZWwgdmlzLWNvbmZpZy1zIitlLmxlbmd0aCxvLmlubmVySFRNTD0hMD09PWk/IjxpPjxiPiIrdCsiOjwvYj48L2k+Ijp0KyI6IixvfX0se2tleToiX21ha2VEcm9wZG93biIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpO28uY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXNlbGVjdCI7dmFyIG49MDt2b2lkIDAhPT1lJiYtMSE9PXQuaW5kZXhPZihlKSYmKG49dC5pbmRleE9mKGUpKTtmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7ci52YWx1ZT10W3NdLHM9PT1uJiYoci5zZWxlY3RlZD0ic2VsZWN0ZWQiKSxyLmlubmVySFRNTD10W3NdLG8uYXBwZW5kQ2hpbGQocil9dmFyIGE9dGhpcztvLm9uY2hhbmdlPWZ1bmN0aW9uKCl7YS5fdXBkYXRlKHRoaXMudmFsdWUsaSl9O3ZhciBoPXRoaXMuX21ha2VMYWJlbChpW2kubGVuZ3RoLTFdLGkpO3RoaXMuX21ha2VJdGVtKGksaCxvKX19LHtrZXk6Il9tYWtlUmFuZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10WzBdLG49dFsxXSxzPXRbMl0scj10WzNdLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTthLmNsYXNzTmFtZT0idmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1yYW5nZSI7dHJ5e2EudHlwZT0icmFuZ2UiLGEubWluPW4sYS5tYXg9c31jYXRjaCh0KXt9YS5zdGVwPXI7dmFyIGg9IiIsZD0wO2lmKHZvaWQgMCE9PWUpe2U8MCYmMS4yKmU8bj8oYS5taW49TWF0aC5jZWlsKDEuMiplKSxkPWEubWluLGg9InJhbmdlIGluY3JlYXNlZCIpOmUvMS4yPG4mJihhLm1pbj1NYXRoLmNlaWwoZS8xLjIpLGQ9YS5taW4saD0icmFuZ2UgaW5jcmVhc2VkIiksMS4yKmU+cyYmMSE9PXMmJihhLm1heD1NYXRoLmNlaWwoMS4yKmUpLGQ9YS5tYXgsaD0icmFuZ2UgaW5jcmVhc2VkIiksYS52YWx1ZT1lfWVsc2UgYS52YWx1ZT1vO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7bC5jbGFzc05hbWU9InZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctcmFuZ2VpbnB1dCIsbC52YWx1ZT1hLnZhbHVlO3ZhciB1PXRoaXM7YS5vbmNoYW5nZT1mdW5jdGlvbigpe2wudmFsdWU9dGhpcy52YWx1ZSx1Ll91cGRhdGUoTnVtYmVyKHRoaXMudmFsdWUpLGkpfSxhLm9uaW5wdXQ9ZnVuY3Rpb24oKXtsLnZhbHVlPXRoaXMudmFsdWV9O3ZhciBjPXRoaXMuX21ha2VMYWJlbChpW2kubGVuZ3RoLTFdLGkpLHA9dGhpcy5fbWFrZUl0ZW0oaSxjLGEsbCk7IiIhPT1oJiZ0aGlzLnBvcHVwSGlzdG9yeVtwXSE9PWQmJih0aGlzLnBvcHVwSGlzdG9yeVtwXT1kLHRoaXMuX3NldHVwUG9wdXAoaCxwKSl9fSx7a2V5OiJfc2V0dXBQb3B1cCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzO2lmKCEwPT09dGhpcy5pbml0aWFsaXplZCYmITA9PT10aGlzLmFsbG93Q3JlYXRpb24mJnRoaXMucG9wdXBDb3VudGVyPHRoaXMucG9wdXBMaW1pdCl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7by5pZD0idmlzLWNvbmZpZ3VyYXRpb24tcG9wdXAiLG8uY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbi1wb3B1cCIsby5pbm5lckhUTUw9dCxvLm9uY2xpY2s9ZnVuY3Rpb24oKXtpLl9yZW1vdmVQb3B1cCgpfSx0aGlzLnBvcHVwQ291bnRlcis9MSx0aGlzLnBvcHVwRGl2PXtodG1sOm8saW5kZXg6ZX19fX0se2tleToiX3JlbW92ZVBvcHVwIix2YWx1ZTpmdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMucG9wdXBEaXYuaHRtbCYmKHRoaXMucG9wdXBEaXYuaHRtbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucG9wdXBEaXYuaHRtbCksY2xlYXJUaW1lb3V0KHRoaXMucG9wdXBEaXYuaGlkZVRpbWVvdXQpLGNsZWFyVGltZW91dCh0aGlzLnBvcHVwRGl2LmRlbGV0ZVRpbWVvdXQpLHRoaXMucG9wdXBEaXY9e30pfX0se2tleToiX3Nob3dQb3B1cElmTmVlZGVkIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodm9pZCAwIT09dGhpcy5wb3B1cERpdi5odG1sKXt2YXIgZT10aGlzLmRvbUVsZW1lbnRzW3RoaXMucG9wdXBEaXYuaW5kZXhdLGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLnBvcHVwRGl2Lmh0bWwuc3R5bGUubGVmdD1pLmxlZnQrInB4Iix0aGlzLnBvcHVwRGl2Lmh0bWwuc3R5bGUudG9wPWkudG9wLTMwKyJweCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnBvcHVwRGl2Lmh0bWwpLHRoaXMucG9wdXBEaXYuaGlkZVRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3QucG9wdXBEaXYuaHRtbC5zdHlsZS5vcGFjaXR5PTB9LDE1MDApLHRoaXMucG9wdXBEaXYuZGVsZXRlVGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fcmVtb3ZlUG9wdXAoKX0sMTgwMCl9fX0se2tleToiX21ha2VDaGVja2JveCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7by50eXBlPSJjaGVja2JveCIsby5jbGFzc05hbWU9InZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctY2hlY2tib3giLG8uY2hlY2tlZD10LHZvaWQgMCE9PWUmJihvLmNoZWNrZWQ9ZSxlIT09dCYmKCJvYmplY3QiPT09KHZvaWQgMD09PXQ/InVuZGVmaW5lZCI6KDAsYS5kZWZhdWx0KSh0KSk/ZSE9PXQuZW5hYmxlZCYmdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6ZX0pOnRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7cGF0aDppLHZhbHVlOmV9KSkpO3ZhciBuPXRoaXM7by5vbmNoYW5nZT1mdW5jdGlvbigpe24uX3VwZGF0ZSh0aGlzLmNoZWNrZWQsaSl9O3ZhciBzPXRoaXMuX21ha2VMYWJlbChpW2kubGVuZ3RoLTFdLGkpO3RoaXMuX21ha2VJdGVtKGkscyxvKX19LHtrZXk6Il9tYWtlVGV4dElucHV0Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtvLnR5cGU9InRleHQiLG8uY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXRleHQiLG8udmFsdWU9ZSxlIT09dCYmdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6ZX0pO3ZhciBuPXRoaXM7by5vbmNoYW5nZT1mdW5jdGlvbigpe24uX3VwZGF0ZSh0aGlzLnZhbHVlLGkpfTt2YXIgcz10aGlzLl9tYWtlTGFiZWwoaVtpLmxlbmd0aC0xXSxpKTt0aGlzLl9tYWtlSXRlbShpLHMsbyl9fSx7a2V5OiJfbWFrZUNvbG9yRmllbGQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10aGlzLG49dFsxXSxzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2U9dm9pZCAwPT09ZT9uOmUsIm5vbmUiIT09ZT8ocy5jbGFzc05hbWU9InZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctY29sb3JCbG9jayIscy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9ZSk6cy5jbGFzc05hbWU9InZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctY29sb3JCbG9jayBub25lIixlPXZvaWQgMD09PWU/bjplLHMub25jbGljaz1mdW5jdGlvbigpe28uX3Nob3dDb2xvclBpY2tlcihlLHMsaSl9O3ZhciByPXRoaXMuX21ha2VMYWJlbChpW2kubGVuZ3RoLTFdLGkpO3RoaXMuX21ha2VJdGVtKGkscixzKX19LHtrZXk6Il9zaG93Q29sb3JQaWNrZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10aGlzO2Uub25jbGljaz1mdW5jdGlvbigpe30sdGhpcy5jb2xvclBpY2tlci5pbnNlcnRUbyhlKSx0aGlzLmNvbG9yUGlja2VyLnNob3coKSx0aGlzLmNvbG9yUGlja2VyLnNldENvbG9yKHQpLHRoaXMuY29sb3JQaWNrZXIuc2V0VXBkYXRlQ2FsbGJhY2soZnVuY3Rpb24odCl7dmFyIG49InJnYmEoIit0LnIrIiwiK3QuZysiLCIrdC5iKyIsIit0LmErIikiO2Uuc3R5bGUuYmFja2dyb3VuZENvbG9yPW4sby5fdXBkYXRlKG4saSl9KSx0aGlzLmNvbG9yUGlja2VyLnNldENsb3NlQ2FsbGJhY2soZnVuY3Rpb24oKXtlLm9uY2xpY2s9ZnVuY3Rpb24oKXtvLl9zaG93Q29sb3JQaWNrZXIodCxlLGkpfX0pfX0se2tleToiX2hhbmRsZU9iamVjdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOltdLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxvPSExLG49dGhpcy5vcHRpb25zLmZpbHRlcixzPSExO2Zvcih2YXIgciBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocikpe289ITA7dmFyIGE9dFtyXSxoPWMuY29weUFuZEV4dGVuZEFycmF5KGUscik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4mJiExPT09KG89bihyLGUpKSYmIShhIGluc3RhbmNlb2YgQXJyYXkpJiYic3RyaW5nIiE9dHlwZW9mIGEmJiJib29sZWFuIiE9dHlwZW9mIGEmJmEgaW5zdGFuY2VvZiBPYmplY3QmJih0aGlzLmFsbG93Q3JlYXRpb249ITEsbz10aGlzLl9oYW5kbGVPYmplY3QoYSxoLCEwKSx0aGlzLmFsbG93Q3JlYXRpb249ITE9PT1pKSwhMSE9PW8pe3M9ITA7dmFyIGQ9dGhpcy5fZ2V0VmFsdWUoaCk7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXRoaXMuX2hhbmRsZUFycmF5KGEsZCxoKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgYSl0aGlzLl9tYWtlVGV4dElucHV0KGEsZCxoKTtlbHNlIGlmKCJib29sZWFuIj09dHlwZW9mIGEpdGhpcy5fbWFrZUNoZWNrYm94KGEsZCxoKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBPYmplY3Qpe3ZhciBsPSEwO2lmKC0xIT09ZS5pbmRleE9mKCJwaHlzaWNzIikmJnRoaXMubW9kdWxlT3B0aW9ucy5waHlzaWNzLnNvbHZlciE9PXImJihsPSExKSwhMD09PWwpaWYodm9pZCAwIT09YS5lbmFibGVkKXt2YXIgdT1jLmNvcHlBbmRFeHRlbmRBcnJheShoLCJlbmFibGVkIikscD10aGlzLl9nZXRWYWx1ZSh1KTtpZighMD09PXApe3ZhciBmPXRoaXMuX21ha2VMYWJlbChyLGgsITApO3RoaXMuX21ha2VJdGVtKGgsZikscz10aGlzLl9oYW5kbGVPYmplY3QoYSxoKXx8c31lbHNlIHRoaXMuX21ha2VDaGVja2JveChhLHAsaCl9ZWxzZXt2YXIgbT10aGlzLl9tYWtlTGFiZWwocixoLCEwKTt0aGlzLl9tYWtlSXRlbShoLG0pLHM9dGhpcy5faGFuZGxlT2JqZWN0KGEsaCl8fHN9fWVsc2UgY29uc29sZS5lcnJvcigiZG9udCBrbm93IGhvdyB0byBoYW5kbGUiLGEscixoKX19cmV0dXJuIHN9fSx7a2V5OiJfaGFuZGxlQXJyYXkiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXsic3RyaW5nIj09dHlwZW9mIHRbMF0mJiJjb2xvciI9PT10WzBdPyh0aGlzLl9tYWtlQ29sb3JGaWVsZCh0LGUsaSksdFsxXSE9PWUmJnRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7cGF0aDppLHZhbHVlOmV9KSk6InN0cmluZyI9PXR5cGVvZiB0WzBdPyh0aGlzLl9tYWtlRHJvcGRvd24odCxlLGkpLHRbMF0hPT1lJiZ0aGlzLmNoYW5nZWRPcHRpb25zLnB1c2goe3BhdGg6aSx2YWx1ZTplfSkpOiJudW1iZXIiPT10eXBlb2YgdFswXSYmKHRoaXMuX21ha2VSYW5nZSh0LGUsaSksdFswXSE9PWUmJnRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7cGF0aDppLHZhbHVlOk51bWJlcihlKX0pKX19LHtrZXk6Il91cGRhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fY29uc3RydWN0T3B0aW9ucyh0LGUpO3RoaXMucGFyZW50LmJvZHkmJnRoaXMucGFyZW50LmJvZHkuZW1pdHRlciYmdGhpcy5wYXJlbnQuYm9keS5lbWl0dGVyLmVtaXQmJnRoaXMucGFyZW50LmJvZHkuZW1pdHRlci5lbWl0KCJjb25maWdDaGFuZ2UiLGkpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsdGhpcy5wYXJlbnQuc2V0T3B0aW9ucyhpKX19LHtrZXk6Il9jb25zdHJ1Y3RPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxvPWk7dD0idHJ1ZSI9PT10fHx0LHQ9ImZhbHNlIiE9PXQmJnQ7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspImdsb2JhbCIhPT1lW25dJiYodm9pZCAwPT09b1tlW25dXSYmKG9bZVtuXV09e30pLG4hPT1lLmxlbmd0aC0xP289b1tlW25dXTpvW2Vbbl1dPXQpO3JldHVybiBpfX0se2tleToiX3ByaW50T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldE9wdGlvbnMoKTt0aGlzLm9wdGlvbnNDb250YWluZXIuaW5uZXJIVE1MPSI8cHJlPnZhciBvcHRpb25zID0gIisoMCxzLmRlZmF1bHQpKHQsbnVsbCwyKSsiPC9wcmU+In19LHtrZXk6ImdldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXt9LGU9MDtlPHRoaXMuY2hhbmdlZE9wdGlvbnMubGVuZ3RoO2UrKyl0aGlzLl9jb25zdHJ1Y3RPcHRpb25zKHRoaXMuY2hhbmdlZE9wdGlvbnNbZV0udmFsdWUsdGhpcy5jaGFuZ2VkT3B0aW9uc1tlXS5wYXRoLHQpO3JldHVybiB0fX1dKSx0fSgpO2UuZGVmYXVsdD1mfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoOTApLHM9byhuKSxyPWkoMTM0KSxhPW8ociksaD1pKDEzNSksZD1vKGgpLGw9aSgxMTIpLHU9aSgxMTkpLGM9aSgxKSxwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXToxOygwLGEuZGVmYXVsdCkodGhpcyx0KSx0aGlzLnBpeGVsUmF0aW89ZSx0aGlzLmdlbmVyYXRlZD0hMSx0aGlzLmNlbnRlckNvb3JkaW5hdGVzPXt4OjE0NC41LHk6MTQ0LjV9LHRoaXMucj0yODkqLjQ5LHRoaXMuY29sb3I9e3I6MjU1LGc6MjU1LGI6MjU1LGE6MX0sdGhpcy5odWVDaXJjbGU9dm9pZCAwLHRoaXMuaW5pdGlhbENvbG9yPXtyOjI1NSxnOjI1NSxiOjI1NSxhOjF9LHRoaXMucHJldmlvdXNDb2xvcj12b2lkIDAsdGhpcy5hcHBsaWVkPSExLHRoaXMudXBkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXt9LHRoaXMuY2xvc2VDYWxsYmFjaz1mdW5jdGlvbigpe30sdGhpcy5fY3JlYXRlKCl9cmV0dXJuKDAsZC5kZWZhdWx0KSh0LFt7a2V5OiJpbnNlcnRUbyIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwIT09dGhpcy5oYW1tZXImJih0aGlzLmhhbW1lci5kZXN0cm95KCksdGhpcy5oYW1tZXI9dm9pZCAwKSx0aGlzLmNvbnRhaW5lcj10LHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpLHRoaXMuX2JpbmRIYW1tZXIoKSx0aGlzLl9zZXRTaXplKCl9fSx7a2V5OiJzZXRVcGRhdGVDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJGdW5jdGlvbiBhdHRlbXB0ZWQgdG8gc2V0IGFzIGNvbG9yUGlja2VyIHVwZGF0ZSBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4iKTt0aGlzLnVwZGF0ZUNhbGxiYWNrPXR9fSx7a2V5OiJzZXRDbG9zZUNhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIkZ1bmN0aW9uIGF0dGVtcHRlZCB0byBzZXQgYXMgY29sb3JQaWNrZXIgY2xvc2luZyBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4iKTt0aGlzLmNsb3NlQ2FsbGJhY2s9dH19LHtrZXk6Il9pc0NvbG9yU3RyaW5nIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT17YmxhY2s6IiMwMDAwMDAiLG5hdnk6IiMwMDAwODAiLGRhcmtibHVlOiIjMDAwMDhCIixtZWRpdW1ibHVlOiIjMDAwMENEIixibHVlOiIjMDAwMEZGIixkYXJrZ3JlZW46IiMwMDY0MDAiLGdyZWVuOiIjMDA4MDAwIix0ZWFsOiIjMDA4MDgwIixkYXJrY3lhbjoiIzAwOEI4QiIsZGVlcHNreWJsdWU6IiMwMEJGRkYiLGRhcmt0dXJxdW9pc2U6IiMwMENFRDEiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBGQTlBIixsaW1lOiIjMDBGRjAwIixzcHJpbmdncmVlbjoiIzAwRkY3RiIsYXF1YToiIzAwRkZGRiIsY3lhbjoiIzAwRkZGRiIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixkb2RnZXJibHVlOiIjMUU5MEZGIixsaWdodHNlYWdyZWVuOiIjMjBCMkFBIixmb3Jlc3RncmVlbjoiIzIyOEIyMiIsc2VhZ3JlZW46IiMyRThCNTciLGRhcmtzbGF0ZWdyYXk6IiMyRjRGNEYiLGxpbWVncmVlbjoiIzMyQ0QzMiIsbWVkaXVtc2VhZ3JlZW46IiMzQ0IzNzEiLHR1cnF1b2lzZToiIzQwRTBEMCIscm95YWxibHVlOiIjNDE2OUUxIixzdGVlbGJsdWU6IiM0NjgyQjQiLGRhcmtzbGF0ZWJsdWU6IiM0ODNEOEIiLG1lZGl1bXR1cnF1b2lzZToiIzQ4RDFDQyIsaW5kaWdvOiIjNEIwMDgyIixkYXJrb2xpdmVncmVlbjoiIzU1NkIyRiIsY2FkZXRibHVlOiIjNUY5RUEwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVFRCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Q0RBQSIsZGltZ3JheToiIzY5Njk2OSIsc2xhdGVibHVlOiIjNkE1QUNEIixvbGl2ZWRyYWI6IiM2QjhFMjMiLHNsYXRlZ3JheToiIzcwODA5MCIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLG1lZGl1bXNsYXRlYmx1ZToiIzdCNjhFRSIsbGF3bmdyZWVuOiIjN0NGQzAwIixjaGFydHJldXNlOiIjN0ZGRjAwIixhcXVhbWFyaW5lOiIjN0ZGRkQ0IixtYXJvb246IiM4MDAwMDAiLHB1cnBsZToiIzgwMDA4MCIsb2xpdmU6IiM4MDgwMDAiLGdyYXk6IiM4MDgwODAiLHNreWJsdWU6IiM4N0NFRUIiLGxpZ2h0c2t5Ymx1ZToiIzg3Q0VGQSIsYmx1ZXZpb2xldDoiIzhBMkJFMiIsZGFya3JlZDoiIzhCMDAwMCIsZGFya21hZ2VudGE6IiM4QjAwOEIiLHNhZGRsZWJyb3duOiIjOEI0NTEzIixkYXJrc2VhZ3JlZW46IiM4RkJDOEYiLGxpZ2h0Z3JlZW46IiM5MEVFOTAiLG1lZGl1bXB1cnBsZToiIzkzNzBEOCIsZGFya3Zpb2xldDoiIzk0MDBEMyIscGFsZWdyZWVuOiIjOThGQjk4IixkYXJrb3JjaGlkOiIjOTkzMkNDIix5ZWxsb3dncmVlbjoiIzlBQ0QzMiIsc2llbm5hOiIjQTA1MjJEIixicm93bjoiI0E1MkEyQSIsZGFya2dyYXk6IiNBOUE5QTkiLGxpZ2h0Ymx1ZToiI0FERDhFNiIsZ3JlZW55ZWxsb3c6IiNBREZGMkYiLHBhbGV0dXJxdW9pc2U6IiNBRkVFRUUiLGxpZ2h0c3RlZWxibHVlOiIjQjBDNERFIixwb3dkZXJibHVlOiIjQjBFMEU2IixmaXJlYnJpY2s6IiNCMjIyMjIiLGRhcmtnb2xkZW5yb2Q6IiNCODg2MEIiLG1lZGl1bW9yY2hpZDoiI0JBNTVEMyIscm9zeWJyb3duOiIjQkM4RjhGIixkYXJra2hha2k6IiNCREI3NkIiLHNpbHZlcjoiI0MwQzBDMCIsbWVkaXVtdmlvbGV0cmVkOiIjQzcxNTg1IixpbmRpYW5yZWQ6IiNDRDVDNUMiLHBlcnU6IiNDRDg1M0YiLGNob2NvbGF0ZToiI0QyNjkxRSIsdGFuOiIjRDJCNDhDIixsaWdodGdyZXk6IiNEM0QzRDMiLHBhbGV2aW9sZXRyZWQ6IiNEODcwOTMiLHRoaXN0bGU6IiNEOEJGRDgiLG9yY2hpZDoiI0RBNzBENiIsZ29sZGVucm9kOiIjREFBNTIwIixjcmltc29uOiIjREMxNDNDIixnYWluc2Jvcm86IiNEQ0RDREMiLHBsdW06IiNEREEwREQiLGJ1cmx5d29vZDoiI0RFQjg4NyIsbGlnaHRjeWFuOiIjRTBGRkZGIixsYXZlbmRlcjoiI0U2RTZGQSIsZGFya3NhbG1vbjoiI0U5OTY3QSIsdmlvbGV0OiIjRUU4MkVFIixwYWxlZ29sZGVucm9kOiIjRUVFOEFBIixsaWdodGNvcmFsOiIjRjA4MDgwIixraGFraToiI0YwRTY4QyIsYWxpY2VibHVlOiIjRjBGOEZGIixob25leWRldzoiI0YwRkZGMCIsYXp1cmU6IiNGMEZGRkYiLHNhbmR5YnJvd246IiNGNEE0NjAiLHdoZWF0OiIjRjVERUIzIixiZWlnZToiI0Y1RjVEQyIsd2hpdGVzbW9rZToiI0Y1RjVGNSIsbWludGNyZWFtOiIjRjVGRkZBIixnaG9zdHdoaXRlOiIjRjhGOEZGIixzYWxtb246IiNGQTgwNzIiLGFudGlxdWV3aGl0ZToiI0ZBRUJENyIsbGluZW46IiNGQUYwRTYiLGxpZ2h0Z29sZGVucm9keWVsbG93OiIjRkFGQUQyIixvbGRsYWNlOiIjRkRGNUU2IixyZWQ6IiNGRjAwMDAiLGZ1Y2hzaWE6IiNGRjAwRkYiLG1hZ2VudGE6IiNGRjAwRkYiLGRlZXBwaW5rOiIjRkYxNDkzIixvcmFuZ2VyZWQ6IiNGRjQ1MDAiLHRvbWF0bzoiI0ZGNjM0NyIsaG90cGluazoiI0ZGNjlCNCIsY29yYWw6IiNGRjdGNTAiLGRhcmtvcmFuZ2U6IiNGRjhDMDAiLGxpZ2h0c2FsbW9uOiIjRkZBMDdBIixvcmFuZ2U6IiNGRkE1MDAiLGxpZ2h0cGluazoiI0ZGQjZDMSIscGluazoiI0ZGQzBDQiIsZ29sZDoiI0ZGRDcwMCIscGVhY2hwdWZmOiIjRkZEQUI5IixuYXZham93aGl0ZToiI0ZGREVBRCIsbW9jY2FzaW46IiNGRkU0QjUiLGJpc3F1ZToiI0ZGRTRDNCIsbWlzdHlyb3NlOiIjRkZFNEUxIixibGFuY2hlZGFsbW9uZDoiI0ZGRUJDRCIscGFwYXlhd2hpcDoiI0ZGRUZENSIsbGF2ZW5kZXJibHVzaDoiI0ZGRjBGNSIsc2Vhc2hlbGw6IiNGRkY1RUUiLGNvcm5zaWxrOiIjRkZGOERDIixsZW1vbmNoaWZmb246IiNGRkZBQ0QiLGZsb3JhbHdoaXRlOiIjRkZGQUYwIixzbm93OiIjRkZGQUZBIix5ZWxsb3c6IiNGRkZGMDAiLGxpZ2h0eWVsbG93OiIjRkZGRkUwIixpdm9yeToiI0ZGRkZGMCIsd2hpdGU6IiNGRkZGRkYifTtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGVbdF19fSx7a2V5OiJzZXRDb2xvciIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTtpZigibm9uZSIhPT10KXt2YXIgaT12b2lkIDAsbz10aGlzLl9pc0NvbG9yU3RyaW5nKHQpO2lmKHZvaWQgMCE9PW8mJih0PW8pLCEwPT09Yy5pc1N0cmluZyh0KSl7aWYoITA9PT1jLmlzVmFsaWRSR0IodCkpe3ZhciBuPXQuc3Vic3RyKDQpLnN1YnN0cigwLHQubGVuZ3RoLTUpLnNwbGl0KCIsIik7aT17cjpuWzBdLGc6blsxXSxiOm5bMl0sYToxfX1lbHNlIGlmKCEwPT09Yy5pc1ZhbGlkUkdCQSh0KSl7dmFyIHI9dC5zdWJzdHIoNSkuc3Vic3RyKDAsdC5sZW5ndGgtNikuc3BsaXQoIiwiKTtpPXtyOnJbMF0sZzpyWzFdLGI6clsyXSxhOnJbM119fWVsc2UgaWYoITA9PT1jLmlzVmFsaWRIZXgodCkpe3ZhciBhPWMuaGV4VG9SR0IodCk7aT17cjphLnIsZzphLmcsYjphLmIsYToxfX19ZWxzZSBpZih0IGluc3RhbmNlb2YgT2JqZWN0JiZ2b2lkIDAhPT10LnImJnZvaWQgMCE9PXQuZyYmdm9pZCAwIT09dC5iKXt2YXIgaD12b2lkIDAhPT10LmE/dC5hOiIxLjAiO2k9e3I6dC5yLGc6dC5nLGI6dC5iLGE6aH19aWYodm9pZCAwPT09aSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29sb3IgcGFzc2VkIHRvIHRoZSBjb2xvclBpY2tlci4gU3VwcG9ydGVkIGFyZSBzdHJpbmdzOiByZ2IsIGhleCwgcmdiYS4gT2JqZWN0OiByZ2IgKHtyOnIsZzpnLGI6YixbYTphXX0pLiBTdXBwbGllZDogIisoMCxzLmRlZmF1bHQpKHQpKTt0aGlzLl9zZXRDb2xvcihpLGUpfX19LHtrZXk6InNob3ciLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5jbG9zZUNhbGxiYWNrJiYodGhpcy5jbG9zZUNhbGxiYWNrKCksdGhpcy5jbG9zZUNhbGxiYWNrPXZvaWQgMCksdGhpcy5hcHBsaWVkPSExLHRoaXMuZnJhbWUuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuX2dlbmVyYXRlSHVlQ2lyY2xlKCl9fSx7a2V5OiJfaGlkZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzOyEwPT09KCEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0pfHxhcmd1bWVudHNbMF0pJiYodGhpcy5wcmV2aW91c0NvbG9yPWMuZXh0ZW5kKHt9LHRoaXMuY29sb3IpKSwhMD09PXRoaXMuYXBwbGllZCYmdGhpcy51cGRhdGVDYWxsYmFjayh0aGlzLmluaXRpYWxDb2xvciksdGhpcy5mcmFtZS5zdHlsZS5kaXNwbGF5PSJub25lIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dm9pZCAwIT09dC5jbG9zZUNhbGxiYWNrJiYodC5jbG9zZUNhbGxiYWNrKCksdC5jbG9zZUNhbGxiYWNrPXZvaWQgMCl9LDApfX0se2tleToiX3NhdmUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVDYWxsYmFjayh0aGlzLmNvbG9yKSx0aGlzLmFwcGxpZWQ9ITEsdGhpcy5faGlkZSgpfX0se2tleToiX2FwcGx5Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYXBwbGllZD0hMCx0aGlzLnVwZGF0ZUNhbGxiYWNrKHRoaXMuY29sb3IpLHRoaXMuX3VwZGF0ZVBpY2tlcih0aGlzLmNvbG9yKX19LHtrZXk6Il9sb2FkTGFzdCIsdmFsdWU6ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLnByZXZpb3VzQ29sb3I/dGhpcy5zZXRDb2xvcih0aGlzLnByZXZpb3VzQ29sb3IsITEpOmFsZXJ0KCJUaGVyZSBpcyBubyBsYXN0IGNvbG9yIHRvIGxvYWQuLi4iKX19LHtrZXk6Il9zZXRDb2xvciIsdmFsdWU6ZnVuY3Rpb24odCl7ITA9PT0oIShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXSkmJih0aGlzLmluaXRpYWxDb2xvcj1jLmV4dGVuZCh7fSx0KSksdGhpcy5jb2xvcj10O3ZhciBlPWMuUkdCVG9IU1YodC5yLHQuZyx0LmIpLGk9MipNYXRoLlBJLG89dGhpcy5yKmUucyxuPXRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueCtvKk1hdGguc2luKGkqZS5oKSxzPXRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueStvKk1hdGguY29zKGkqZS5oKTt0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3Iuc3R5bGUubGVmdD1uLS41KnRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5jbGllbnRXaWR0aCsicHgiLHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5zdHlsZS50b3A9cy0uNSp0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IuY2xpZW50SGVpZ2h0KyJweCIsdGhpcy5fdXBkYXRlUGlja2VyKHQpfX0se2tleToiX3NldE9wYWNpdHkiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuY29sb3IuYT10LzEwMCx0aGlzLl91cGRhdGVQaWNrZXIodGhpcy5jb2xvcil9fSx7a2V5OiJfc2V0QnJpZ2h0bmVzcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9Yy5SR0JUb0hTVih0aGlzLmNvbG9yLnIsdGhpcy5jb2xvci5nLHRoaXMuY29sb3IuYik7ZS52PXQvMTAwO3ZhciBpPWMuSFNWVG9SR0IoZS5oLGUucyxlLnYpO2kuYT10aGlzLmNvbG9yLmEsdGhpcy5jb2xvcj1pLHRoaXMuX3VwZGF0ZVBpY2tlcigpfX0se2tleToiX3VwZGF0ZVBpY2tlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5jb2xvcixlPWMuUkdCVG9IU1YodC5yLHQuZyx0LmIpLGk9dGhpcy5jb2xvclBpY2tlckNhbnZhcy5nZXRDb250ZXh0KCIyZCIpO3ZvaWQgMD09PXRoaXMucGl4ZWxSYXRpb24mJih0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8oaS53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxpLm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGkubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxpLm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxpLmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpKSxpLnNldFRyYW5zZm9ybSh0aGlzLnBpeGVsUmF0aW8sMCwwLHRoaXMucGl4ZWxSYXRpbywwLDApO3ZhciBvPXRoaXMuY29sb3JQaWNrZXJDYW52YXMuY2xpZW50V2lkdGgsbj10aGlzLmNvbG9yUGlja2VyQ2FudmFzLmNsaWVudEhlaWdodDtpLmNsZWFyUmVjdCgwLDAsbyxuKSxpLnB1dEltYWdlRGF0YSh0aGlzLmh1ZUNpcmNsZSwwLDApLGkuZmlsbFN0eWxlPSJyZ2JhKDAsMCwwLCIrKDEtZS52KSsiKSIsaS5jaXJjbGUodGhpcy5jZW50ZXJDb29yZGluYXRlcy54LHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueSx0aGlzLnIpLGkuZmlsbCgpLHRoaXMuYnJpZ2h0bmVzc1JhbmdlLnZhbHVlPTEwMCplLnYsdGhpcy5vcGFjaXR5UmFuZ2UudmFsdWU9MTAwKnQuYSx0aGlzLmluaXRpYWxDb2xvckRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYmEoIit0aGlzLmluaXRpYWxDb2xvci5yKyIsIit0aGlzLmluaXRpYWxDb2xvci5nKyIsIit0aGlzLmluaXRpYWxDb2xvci5iKyIsIit0aGlzLmluaXRpYWxDb2xvci5hKyIpIix0aGlzLm5ld0NvbG9yRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmdiYSgiK3RoaXMuY29sb3IucisiLCIrdGhpcy5jb2xvci5nKyIsIit0aGlzLmNvbG9yLmIrIiwiK3RoaXMuY29sb3IuYSsiKSJ9fSx7a2V5OiJfc2V0U2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmNvbG9yUGlja2VyQ2FudmFzLnN0eWxlLndpZHRoPSIxMDAlIix0aGlzLmNvbG9yUGlja2VyQ2FudmFzLnN0eWxlLmhlaWdodD0iMTAwJSIsdGhpcy5jb2xvclBpY2tlckNhbnZhcy53aWR0aD0yODkqdGhpcy5waXhlbFJhdGlvLHRoaXMuY29sb3JQaWNrZXJDYW52YXMuaGVpZ2h0PTI4OSp0aGlzLnBpeGVsUmF0aW99fSx7a2V5OiJfY3JlYXRlIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5mcmFtZS5jbGFzc05hbWU9InZpcy1jb2xvci1waWNrZXIiLHRoaXMuY29sb3JQaWNrZXJEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5jbGFzc05hbWU9InZpcy1zZWxlY3RvciIsdGhpcy5jb2xvclBpY2tlckRpdi5hcHBlbmRDaGlsZCh0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IpLHRoaXMuY29sb3JQaWNrZXJDYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksdGhpcy5jb2xvclBpY2tlckRpdi5hcHBlbmRDaGlsZCh0aGlzLmNvbG9yUGlja2VyQ2FudmFzKSx0aGlzLmNvbG9yUGlja2VyQ2FudmFzLmdldENvbnRleHQpe3ZhciB0PXRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTt0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8odC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpLHRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dCgiMmQiKS5zZXRUcmFuc2Zvcm0odGhpcy5waXhlbFJhdGlvLDAsMCx0aGlzLnBpeGVsUmF0aW8sMCwwKX1lbHNle3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpO2Uuc3R5bGUuY29sb3I9InJlZCIsZS5zdHlsZS5mb250V2VpZ2h0PSJib2xkIixlLnN0eWxlLnBhZGRpbmc9IjEwcHgiLGUuaW5uZXJIVE1MPSJFcnJvcjogeW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgSFRNTCBjYW52YXMiLHRoaXMuY29sb3JQaWNrZXJDYW52YXMuYXBwZW5kQ2hpbGQoZSl9dGhpcy5jb2xvclBpY2tlckRpdi5jbGFzc05hbWU9InZpcy1jb2xvciIsdGhpcy5vcGFjaXR5RGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMub3BhY2l0eURpdi5jbGFzc05hbWU9InZpcy1vcGFjaXR5Iix0aGlzLmJyaWdodG5lc3NEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5icmlnaHRuZXNzRGl2LmNsYXNzTmFtZT0idmlzLWJyaWdodG5lc3MiLHRoaXMuYXJyb3dEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5hcnJvd0Rpdi5jbGFzc05hbWU9InZpcy1hcnJvdyIsdGhpcy5vcGFjaXR5UmFuZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0cnl7dGhpcy5vcGFjaXR5UmFuZ2UudHlwZT0icmFuZ2UiLHRoaXMub3BhY2l0eVJhbmdlLm1pbj0iMCIsdGhpcy5vcGFjaXR5UmFuZ2UubWF4PSIxMDAifWNhdGNoKHQpe310aGlzLm9wYWNpdHlSYW5nZS52YWx1ZT0iMTAwIix0aGlzLm9wYWNpdHlSYW5nZS5jbGFzc05hbWU9InZpcy1yYW5nZSIsdGhpcy5icmlnaHRuZXNzUmFuZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0cnl7dGhpcy5icmlnaHRuZXNzUmFuZ2UudHlwZT0icmFuZ2UiLHRoaXMuYnJpZ2h0bmVzc1JhbmdlLm1pbj0iMCIsdGhpcy5icmlnaHRuZXNzUmFuZ2UubWF4PSIxMDAifWNhdGNoKHQpe310aGlzLmJyaWdodG5lc3NSYW5nZS52YWx1ZT0iMTAwIix0aGlzLmJyaWdodG5lc3NSYW5nZS5jbGFzc05hbWU9InZpcy1yYW5nZSIsdGhpcy5vcGFjaXR5RGl2LmFwcGVuZENoaWxkKHRoaXMub3BhY2l0eVJhbmdlKSx0aGlzLmJyaWdodG5lc3NEaXYuYXBwZW5kQ2hpbGQodGhpcy5icmlnaHRuZXNzUmFuZ2UpO3ZhciBpPXRoaXM7dGhpcy5vcGFjaXR5UmFuZ2Uub25jaGFuZ2U9ZnVuY3Rpb24oKXtpLl9zZXRPcGFjaXR5KHRoaXMudmFsdWUpfSx0aGlzLm9wYWNpdHlSYW5nZS5vbmlucHV0PWZ1bmN0aW9uKCl7aS5fc2V0T3BhY2l0eSh0aGlzLnZhbHVlKX0sdGhpcy5icmlnaHRuZXNzUmFuZ2Uub25jaGFuZ2U9ZnVuY3Rpb24oKXtpLl9zZXRCcmlnaHRuZXNzKHRoaXMudmFsdWUpfSx0aGlzLmJyaWdodG5lc3NSYW5nZS5vbmlucHV0PWZ1bmN0aW9uKCl7aS5fc2V0QnJpZ2h0bmVzcyh0aGlzLnZhbHVlKX0sdGhpcy5icmlnaHRuZXNzTGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5icmlnaHRuZXNzTGFiZWwuY2xhc3NOYW1lPSJ2aXMtbGFiZWwgdmlzLWJyaWdodG5lc3MiLHRoaXMuYnJpZ2h0bmVzc0xhYmVsLmlubmVySFRNTD0iYnJpZ2h0bmVzczoiLHRoaXMub3BhY2l0eUxhYmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMub3BhY2l0eUxhYmVsLmNsYXNzTmFtZT0idmlzLWxhYmVsIHZpcy1vcGFjaXR5Iix0aGlzLm9wYWNpdHlMYWJlbC5pbm5lckhUTUw9Im9wYWNpdHk6Iix0aGlzLm5ld0NvbG9yRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMubmV3Q29sb3JEaXYuY2xhc3NOYW1lPSJ2aXMtbmV3LWNvbG9yIix0aGlzLm5ld0NvbG9yRGl2LmlubmVySFRNTD0ibmV3Iix0aGlzLmluaXRpYWxDb2xvckRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmluaXRpYWxDb2xvckRpdi5jbGFzc05hbWU9InZpcy1pbml0aWFsLWNvbG9yIix0aGlzLmluaXRpYWxDb2xvckRpdi5pbm5lckhUTUw9ImluaXRpYWwiLHRoaXMuY2FuY2VsQnV0dG9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY2FuY2VsQnV0dG9uLmNsYXNzTmFtZT0idmlzLWJ1dHRvbiB2aXMtY2FuY2VsIix0aGlzLmNhbmNlbEJ1dHRvbi5pbm5lckhUTUw9ImNhbmNlbCIsdGhpcy5jYW5jZWxCdXR0b24ub25jbGljaz10aGlzLl9oaWRlLmJpbmQodGhpcywhMSksdGhpcy5hcHBseUJ1dHRvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmFwcGx5QnV0dG9uLmNsYXNzTmFtZT0idmlzLWJ1dHRvbiB2aXMtYXBwbHkiLHRoaXMuYXBwbHlCdXR0b24uaW5uZXJIVE1MPSJhcHBseSIsdGhpcy5hcHBseUJ1dHRvbi5vbmNsaWNrPXRoaXMuX2FwcGx5LmJpbmQodGhpcyksdGhpcy5zYXZlQnV0dG9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2F2ZUJ1dHRvbi5jbGFzc05hbWU9InZpcy1idXR0b24gdmlzLXNhdmUiLHRoaXMuc2F2ZUJ1dHRvbi5pbm5lckhUTUw9InNhdmUiLHRoaXMuc2F2ZUJ1dHRvbi5vbmNsaWNrPXRoaXMuX3NhdmUuYmluZCh0aGlzKSx0aGlzLmxvYWRCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5sb2FkQnV0dG9uLmNsYXNzTmFtZT0idmlzLWJ1dHRvbiB2aXMtbG9hZCIsdGhpcy5sb2FkQnV0dG9uLmlubmVySFRNTD0ibG9hZCBsYXN0Iix0aGlzLmxvYWRCdXR0b24ub25jbGljaz10aGlzLl9sb2FkTGFzdC5iaW5kKHRoaXMpLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5jb2xvclBpY2tlckRpdiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmFycm93RGl2KSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYnJpZ2h0bmVzc0xhYmVsKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYnJpZ2h0bmVzc0RpdiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLm9wYWNpdHlMYWJlbCksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLm9wYWNpdHlEaXYpLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5uZXdDb2xvckRpdiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmluaXRpYWxDb2xvckRpdiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmNhbmNlbEJ1dHRvbiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmFwcGx5QnV0dG9uKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuc2F2ZUJ1dHRvbiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmxvYWRCdXR0b24pfX0se2tleToiX2JpbmRIYW1tZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmRyYWc9e30sdGhpcy5waW5jaD17fSx0aGlzLmhhbW1lcj1uZXcgbCh0aGlzLmNvbG9yUGlja2VyQ2FudmFzKSx0aGlzLmhhbW1lci5nZXQoInBpbmNoIikuc2V0KHtlbmFibGU6ITB9KSx1Lm9uVG91Y2godGhpcy5oYW1tZXIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oInRhcCIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oInBhbnN0YXJ0IixmdW5jdGlvbihlKXt0Ll9tb3ZlU2VsZWN0b3IoZSl9KSx0aGlzLmhhbW1lci5vbigicGFubW92ZSIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oInBhbmVuZCIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSl9fSx7a2V5OiJfZ2VuZXJhdGVIdWVDaXJjbGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLmdlbmVyYXRlZCl7dmFyIHQ9dGhpcy5jb2xvclBpY2tlckNhbnZhcy5nZXRDb250ZXh0KCIyZCIpO3ZvaWQgMD09PXRoaXMucGl4ZWxSYXRpb24mJih0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8odC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpKSx0LnNldFRyYW5zZm9ybSh0aGlzLnBpeGVsUmF0aW8sMCwwLHRoaXMucGl4ZWxSYXRpbywwLDApO3ZhciBlPXRoaXMuY29sb3JQaWNrZXJDYW52YXMuY2xpZW50V2lkdGgsaT10aGlzLmNvbG9yUGlja2VyQ2FudmFzLmNsaWVudEhlaWdodDt0LmNsZWFyUmVjdCgwLDAsZSxpKTt2YXIgbz12b2lkIDAsbj12b2lkIDAscz12b2lkIDAscj12b2lkIDA7dGhpcy5jZW50ZXJDb29yZGluYXRlcz17eDouNSplLHk6LjUqaX0sdGhpcy5yPS40OSplO3ZhciBhPTIqTWF0aC5QSS8zNjAsaD0xL3RoaXMucixkPXZvaWQgMDtmb3Iocz0wO3M8MzYwO3MrKylmb3Iocj0wO3I8dGhpcy5yO3IrKylvPXRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueCtyKk1hdGguc2luKGEqcyksbj10aGlzLmNlbnRlckNvb3JkaW5hdGVzLnkrcipNYXRoLmNvcyhhKnMpLGQ9Yy5IU1ZUb1JHQihzKigxLzM2MCkscipoLDEpLHQuZmlsbFN0eWxlPSJyZ2IoIitkLnIrIiwiK2QuZysiLCIrZC5iKyIpIix0LmZpbGxSZWN0KG8tLjUsbi0uNSwyLDIpO3Quc3Ryb2tlU3R5bGU9InJnYmEoMCwwLDAsMSkiLHQuY2lyY2xlKHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueCx0aGlzLmNlbnRlckNvb3JkaW5hdGVzLnksdGhpcy5yKSx0LnN0cm9rZSgpLHRoaXMuaHVlQ2lyY2xlPXQuZ2V0SW1hZ2VEYXRhKDAsMCxlLGkpfXRoaXMuZ2VuZXJhdGVkPSEwfX0se2tleToiX21vdmVTZWxlY3RvciIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb2xvclBpY2tlckRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPXQuY2VudGVyLngtZS5sZWZ0LG89dC5jZW50ZXIueS1lLnRvcCxuPS41KnRoaXMuY29sb3JQaWNrZXJEaXYuY2xpZW50SGVpZ2h0LHM9LjUqdGhpcy5jb2xvclBpY2tlckRpdi5jbGllbnRXaWR0aCxyPWktcyxhPW8tbixoPU1hdGguYXRhbjIocixhKSxkPS45OCpNYXRoLm1pbihNYXRoLnNxcnQocipyK2EqYSkscyksbD1NYXRoLmNvcyhoKSpkK24sdT1NYXRoLnNpbihoKSpkK3M7dGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLnN0eWxlLnRvcD1sLS41KnRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5jbGllbnRIZWlnaHQrInB4Iix0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3Iuc3R5bGUubGVmdD11LS41KnRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5jbGllbnRXaWR0aCsicHgiO3ZhciBwPWgvKDIqTWF0aC5QSSk7cD1wPDA/cCsxOnA7dmFyIGY9ZC90aGlzLnIsbT1jLlJHQlRvSFNWKHRoaXMuY29sb3Iucix0aGlzLmNvbG9yLmcsdGhpcy5jb2xvci5iKTttLmg9cCxtLnM9Zjt2YXIgdj1jLkhTVlRvUkdCKG0uaCxtLnMsbS52KTt2LmE9dGhpcy5jb2xvci5hLHRoaXMuY29sb3I9dix0aGlzLmluaXRpYWxDb2xvckRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYmEoIit0aGlzLmluaXRpYWxDb2xvci5yKyIsIit0aGlzLmluaXRpYWxDb2xvci5nKyIsIit0aGlzLmluaXRpYWxDb2xvci5iKyIsIit0aGlzLmluaXRpYWxDb2xvci5hKyIpIix0aGlzLm5ld0NvbG9yRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmdiYSgiK3RoaXMuY29sb3IucisiLCIrdGhpcy5jb2xvci5nKyIsIit0aGlzLmNvbG9yLmIrIiwiK3RoaXMuY29sb3IuYSsiKSJ9fV0pLHR9KCk7ZS5kZWZhdWx0PXB9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpLG8pe2lmKCEoQXJyYXkuaXNBcnJheShpKXx8aSBpbnN0YW5jZW9mIHJ8fGkgaW5zdGFuY2VvZiBhKSYmaSBpbnN0YW5jZW9mIE9iamVjdCl7dmFyIGQ9bztvPWksaT1kfW8mJm8udGhyb3R0bGVSZWRyYXcmJmNvbnNvbGUud2FybignR3JhcGgyZCBvcHRpb24gInRocm90dGxlUmVkcmF3IiBpcyBERVBSSUNBVEVEIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgTUFKT1IgcmVsZWFzZS4nKTt2YXIgYz10aGlzO3RoaXMuZGVmYXVsdE9wdGlvbnM9e3N0YXJ0Om51bGwsZW5kOm51bGwsYXV0b1Jlc2l6ZTohMCxvcmllbnRhdGlvbjp7YXhpczoiYm90dG9tIixpdGVtOiJib3R0b20ifSxtb21lbnQ6bix3aWR0aDpudWxsLGhlaWdodDpudWxsLG1heEhlaWdodDpudWxsLG1pbkhlaWdodDpudWxsfSx0aGlzLm9wdGlvbnM9cy5kZWVwRXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuX2NyZWF0ZSh0KSx0aGlzLmNvbXBvbmVudHM9W10sdGhpcy5ib2R5PXtkb206dGhpcy5kb20sZG9tUHJvcHM6dGhpcy5wcm9wcyxlbWl0dGVyOntvbjp0aGlzLm9uLmJpbmQodGhpcyksb2ZmOnRoaXMub2ZmLmJpbmQodGhpcyksZW1pdDp0aGlzLmVtaXQuYmluZCh0aGlzKX0saGlkZGVuRGF0ZXM6W10sdXRpbDp7dG9TY3JlZW46Yy5fdG9TY3JlZW4uYmluZChjKSx0b0dsb2JhbFNjcmVlbjpjLl90b0dsb2JhbFNjcmVlbi5iaW5kKGMpLHRvVGltZTpjLl90b1RpbWUuYmluZChjKSx0b0dsb2JhbFRpbWU6Yy5fdG9HbG9iYWxUaW1lLmJpbmQoYyl9fSx0aGlzLnJhbmdlPW5ldyBoKHRoaXMuYm9keSksdGhpcy5jb21wb25lbnRzLnB1c2godGhpcy5yYW5nZSksdGhpcy5ib2R5LnJhbmdlPXRoaXMucmFuZ2UsdGhpcy50aW1lQXhpcz1uZXcgbCh0aGlzLmJvZHkpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMudGltZUF4aXMpLHRoaXMuY3VycmVudFRpbWU9bmV3IHUodGhpcy5ib2R5KSx0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLmN1cnJlbnRUaW1lKSx0aGlzLmxpbmVncmFwaD1uZXcgcCh0aGlzLmJvZHkpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMubGluZWdyYXBoKSx0aGlzLml0ZW1zRGF0YT1udWxsLHRoaXMuZ3JvdXBzRGF0YT1udWxsLHRoaXMub24oInRhcCIsZnVuY3Rpb24odCl7Yy5lbWl0KCJjbGljayIsYy5nZXRFdmVudFByb3BlcnRpZXModCkpfSksdGhpcy5vbigiZG91YmxldGFwIixmdW5jdGlvbih0KXtjLmVtaXQoImRvdWJsZUNsaWNrIixjLmdldEV2ZW50UHJvcGVydGllcyh0KSl9KSx0aGlzLmRvbS5yb290Lm9uY29udGV4dG1lbnU9ZnVuY3Rpb24odCl7Yy5lbWl0KCJjb250ZXh0bWVudSIsYy5nZXRFdmVudFByb3BlcnRpZXModCkpfSxvJiZ0aGlzLnNldE9wdGlvbnMobyksaSYmdGhpcy5zZXRHcm91cHMoaSksZSYmdGhpcy5zZXRJdGVtcyhlKSx0aGlzLl9yZWRyYXcoKX12YXIgbj0oaSg5OSksaSgxMTIpLGkoODIpKSxzPWkoMSkscj1pKDg5KSxhPWkoOTMpLGg9aSgxMTgpLGQ9aSgxMjIpLGw9aSgxMzkpLHU9aSgxNDMpLGM9aSgxNDEpLHA9aSgxNDkpLGY9aSgxNDQpLnByaW50U3R5bGUsbT1pKDE1NykuYWxsT3B0aW9ucyx2PWkoMTU3KS5jb25maWd1cmVPcHRpb25zLGc9aSgxNDYpLmRlZmF1bHQseT1pKDE0NCkuZGVmYXVsdDtvLnByb3RvdHlwZT1uZXcgZCxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpeyEwPT09eS52YWxpZGF0ZSh0LG0pJiZjb25zb2xlLmxvZygiJWNFcnJvcnMgaGF2ZSBiZWVuIGZvdW5kIGluIHRoZSBzdXBwbGllZCBvcHRpb25zIG9iamVjdC4iLGYpLGQucHJvdG90eXBlLnNldE9wdGlvbnMuY2FsbCh0aGlzLHQpfSxvLnByb3RvdHlwZS5zZXRJdGVtcz1mdW5jdGlvbih0KXt2YXIgZSxpPW51bGw9PXRoaXMuaXRlbXNEYXRhO2lmKGU9dD90IGluc3RhbmNlb2Ygcnx8dCBpbnN0YW5jZW9mIGE/dDpuZXcgcih0LHt0eXBlOntzdGFydDoiRGF0ZSIsZW5kOiJEYXRlIn19KTpudWxsLHRoaXMuaXRlbXNEYXRhPWUsdGhpcy5saW5lZ3JhcGgmJnRoaXMubGluZWdyYXBoLnNldEl0ZW1zKGUpLGkpaWYodm9pZCAwIT10aGlzLm9wdGlvbnMuc3RhcnR8fHZvaWQgMCE9dGhpcy5vcHRpb25zLmVuZCl7dmFyIG89dm9pZCAwIT10aGlzLm9wdGlvbnMuc3RhcnQ/dGhpcy5vcHRpb25zLnN0YXJ0Om51bGwsbj12b2lkIDAhPXRoaXMub3B0aW9ucy5lbmQ/dGhpcy5vcHRpb25zLmVuZDpudWxsO3RoaXMuc2V0V2luZG93KG8sbix7YW5pbWF0aW9uOiExfSl9ZWxzZSB0aGlzLmZpdCh7YW5pbWF0aW9uOiExfSl9LG8ucHJvdG90eXBlLnNldEdyb3Vwcz1mdW5jdGlvbih0KXt2YXIgZTtlPXQ/dCBpbnN0YW5jZW9mIHJ8fHQgaW5zdGFuY2VvZiBhP3Q6bmV3IHIodCk6bnVsbCx0aGlzLmdyb3Vwc0RhdGE9ZSx0aGlzLmxpbmVncmFwaC5zZXRHcm91cHMoZSl9LG8ucHJvdG90eXBlLmdldExlZ2VuZD1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPTE1KSx2b2lkIDA9PT1pJiYoaT0xNSksdm9pZCAwIT09dGhpcy5saW5lZ3JhcGguZ3JvdXBzW3RdP3RoaXMubGluZWdyYXBoLmdyb3Vwc1t0XS5nZXRMZWdlbmQoZSxpKToiY2Fubm90IGZpbmQgZ3JvdXA6JyIrdCsiJyJ9LG8ucHJvdG90eXBlLmlzR3JvdXBWaXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLmxpbmVncmFwaC5ncm91cHNbdF0mJih0aGlzLmxpbmVncmFwaC5ncm91cHNbdF0udmlzaWJsZSYmKHZvaWQgMD09PXRoaXMubGluZWdyYXBoLm9wdGlvbnMuZ3JvdXBzLnZpc2liaWxpdHlbdF18fDE9PXRoaXMubGluZWdyYXBoLm9wdGlvbnMuZ3JvdXBzLnZpc2liaWxpdHlbdF0pKX0sby5wcm90b3R5cGUuZ2V0RGF0YVJhbmdlPWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxlPW51bGw7Zm9yKHZhciBpIGluIHRoaXMubGluZWdyYXBoLmdyb3VwcylpZih0aGlzLmxpbmVncmFwaC5ncm91cHMuaGFzT3duUHJvcGVydHkoaSkmJjE9PXRoaXMubGluZWdyYXBoLmdyb3Vwc1tpXS52aXNpYmxlKWZvcih2YXIgbz0wO288dGhpcy5saW5lZ3JhcGguZ3JvdXBzW2ldLml0ZW1zRGF0YS5sZW5ndGg7bysrKXt2YXIgbj10aGlzLmxpbmVncmFwaC5ncm91cHNbaV0uaXRlbXNEYXRhW29dLHI9cy5jb252ZXJ0KG4ueCwiRGF0ZSIpLnZhbHVlT2YoKTt0PW51bGw9PXQ/cjp0PnI/cjp0LGU9bnVsbD09ZT9yOmU8cj9yOmV9cmV0dXJue21pbjpudWxsIT10P25ldyBEYXRlKHQpOm51bGwsbWF4Om51bGwhPWU/bmV3IERhdGUoZSk6bnVsbH19LG8ucHJvdG90eXBlLmdldEV2ZW50UHJvcGVydGllcz1mdW5jdGlvbih0KXt2YXIgZT10LmNlbnRlcj90LmNlbnRlci54OnQuY2xpZW50WCxpPXQuY2VudGVyP3QuY2VudGVyLnk6dC5jbGllbnRZLG89ZS1zLmdldEFic29sdXRlTGVmdCh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIpLG49aS1zLmdldEFic29sdXRlVG9wKHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lcikscj10aGlzLl90b1RpbWUobyksYT1jLmN1c3RvbVRpbWVGcm9tVGFyZ2V0KHQpLGg9cy5nZXRUYXJnZXQodCksZD1udWxsO3MuaGFzUGFyZW50KGgsdGhpcy50aW1lQXhpcy5kb20uZm9yZWdyb3VuZCk/ZD0iYXhpcyI6dGhpcy50aW1lQXhpczImJnMuaGFzUGFyZW50KGgsdGhpcy50aW1lQXhpczIuZG9tLmZvcmVncm91bmQpP2Q9ImF4aXMiOnMuaGFzUGFyZW50KGgsdGhpcy5saW5lZ3JhcGgueUF4aXNMZWZ0LmRvbS5mcmFtZSk/ZD0iZGF0YS1heGlzIjpzLmhhc1BhcmVudChoLHRoaXMubGluZWdyYXBoLnlBeGlzUmlnaHQuZG9tLmZyYW1lKT9kPSJkYXRhLWF4aXMiOnMuaGFzUGFyZW50KGgsdGhpcy5saW5lZ3JhcGgubGVnZW5kTGVmdC5kb20uZnJhbWUpP2Q9ImxlZ2VuZCI6cy5oYXNQYXJlbnQoaCx0aGlzLmxpbmVncmFwaC5sZWdlbmRSaWdodC5kb20uZnJhbWUpP2Q9ImxlZ2VuZCI6bnVsbCE9YT9kPSJjdXN0b20tdGltZSI6cy5oYXNQYXJlbnQoaCx0aGlzLmN1cnJlbnRUaW1lLmJhcik/ZD0iY3VycmVudC10aW1lIjpzLmhhc1BhcmVudChoLHRoaXMuZG9tLmNlbnRlcikmJihkPSJiYWNrZ3JvdW5kIik7dmFyIGw9W10sdT10aGlzLmxpbmVncmFwaC55QXhpc0xlZnQscD10aGlzLmxpbmVncmFwaC55QXhpc1JpZ2h0O3JldHVybiF1LmhpZGRlbiYmdGhpcy5pdGVtc0RhdGEubGVuZ3RoPjAmJmwucHVzaCh1LnNjcmVlblRvVmFsdWUobikpLCFwLmhpZGRlbiYmdGhpcy5pdGVtc0RhdGEubGVuZ3RoPjAmJmwucHVzaChwLnNjcmVlblRvVmFsdWUobikpLHtldmVudDp0LHdoYXQ6ZCxwYWdlWDp0LnNyY0V2ZW50P3Quc3JjRXZlbnQucGFnZVg6dC5wYWdlWCxwYWdlWTp0LnNyY0V2ZW50P3Quc3JjRXZlbnQucGFnZVk6dC5wYWdlWSx4Om8seTpuLHRpbWU6cix2YWx1ZTpsfX0sby5wcm90b3R5cGUuX2NyZWF0ZUNvbmZpZ3VyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgZyh0aGlzLHRoaXMuZG9tLmNvbnRhaW5lcix2KX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7dGhpcy5pZD1yLnJhbmRvbVVVSUQoKSx0aGlzLmJvZHk9dCx0aGlzLmRlZmF1bHRPcHRpb25zPXt5QXhpc09yaWVudGF0aW9uOiJsZWZ0IixkZWZhdWx0R3JvdXA6ImRlZmF1bHQiLHNvcnQ6ITAsc2FtcGxpbmc6ITAsc3RhY2s6ITEsZ3JhcGhIZWlnaHQ6IjQwMHB4IixzaGFkZWQ6e2VuYWJsZWQ6ITEsb3JpZW50YXRpb246ImJvdHRvbSJ9LHN0eWxlOiJsaW5lIixiYXJDaGFydDp7d2lkdGg6NTAsc2lkZUJ5U2lkZTohMSxhbGlnbjoiY2VudGVyIn0saW50ZXJwb2xhdGlvbjp7ZW5hYmxlZDohMCxwYXJhbWV0cml6YXRpb246ImNlbnRyaXBldGFsIixhbHBoYTouNX0sZHJhd1BvaW50czp7ZW5hYmxlZDohMCxzaXplOjYsc3R5bGU6InNxdWFyZSJ9LGRhdGFBeGlzOnt9LGxlZ2VuZDp7fSxncm91cHM6e3Zpc2liaWxpdHk6e319fSx0aGlzLm9wdGlvbnM9ci5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5kb209e30sdGhpcy5wcm9wcz17fSx0aGlzLmhhbW1lcj1udWxsLHRoaXMuZ3JvdXBzPXt9LHRoaXMuYWJvcnRlZEdyYXBoVXBkYXRlPSExLHRoaXMudXBkYXRlU1ZHaGVpZ2h0PSExLHRoaXMudXBkYXRlU1ZHaGVpZ2h0T25SZXNpemU9ITEsdGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwO3ZhciBpPXRoaXM7dGhpcy5pdGVtc0RhdGE9bnVsbCx0aGlzLmdyb3Vwc0RhdGE9bnVsbCx0aGlzLml0ZW1MaXN0ZW5lcnM9e2FkZDpmdW5jdGlvbih0LGUsbyl7aS5fb25BZGQoZS5pdGVtcyl9LHVwZGF0ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25VcGRhdGUoZS5pdGVtcyl9LHJlbW92ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25SZW1vdmUoZS5pdGVtcyl9fSx0aGlzLmdyb3VwTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlLG8pe2kuX29uQWRkR3JvdXBzKGUuaXRlbXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlLG8pe2kuX29uVXBkYXRlR3JvdXBzKGUuaXRlbXMpfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG8pe2kuX29uUmVtb3ZlR3JvdXBzKGUuaXRlbXMpfX0sdGhpcy5pdGVtcz17fSx0aGlzLnNlbGVjdGlvbj1bXSx0aGlzLmxhc3RTdGFydD10aGlzLmJvZHkucmFuZ2Uuc3RhcnQsdGhpcy50b3VjaFBhcmFtcz17fSx0aGlzLnN2Z0VsZW1lbnRzPXt9LHRoaXMuc2V0T3B0aW9ucyhlKSx0aGlzLmdyb3Vwc1VzaW5nRGVmYXVsdFN0eWxlcz1bMF0sdGhpcy5ib2R5LmVtaXR0ZXIub24oInJhbmdlY2hhbmdlZCIsZnVuY3Rpb24oKXtpLmxhc3RTdGFydD1pLmJvZHkucmFuZ2Uuc3RhcnQsaS5zdmcuc3R5bGUubGVmdD1yLm9wdGlvbi5hc1NpemUoLWkucHJvcHMud2lkdGgpLGkuZm9yY2VHcmFwaFVwZGF0ZT0hMCxpLnJlZHJhdy5jYWxsKGkpfSksdGhpcy5fY3JlYXRlKCksdGhpcy5mcmFtZXdvcms9e3N2Zzp0aGlzLnN2ZyxzdmdFbGVtZW50czp0aGlzLnN2Z0VsZW1lbnRzLG9wdGlvbnM6dGhpcy5vcHRpb25zLGdyb3Vwczp0aGlzLmdyb3Vwc319dmFyIG49aSg2Mikscz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KG4pLHI9aSgxKSxhPWkoODgpLGg9aSg4OSksZD1pKDkzKSxsPWkoMTIwKSx1PWkoMTUwKSxjPWkoMTUyKSxwPWkoMTU2KSxmPWkoMTUzKSxtPWkoMTU1KSx2PWkoMTU0KTtvLnByb3RvdHlwZT1uZXcgbCxvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc05hbWU9InZpcy1saW5lLWdyYXBoIix0aGlzLmRvbS5mcmFtZT10LHRoaXMuc3ZnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJzdmciKSx0aGlzLnN2Zy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLHRoaXMuc3ZnLnN0eWxlLmhlaWdodD0oIiIrdGhpcy5vcHRpb25zLmdyYXBoSGVpZ2h0KS5yZXBsYWNlKCJweCIsIiIpKyJweCIsdGhpcy5zdmcuc3R5bGUuZGlzcGxheT0iYmxvY2siLHQuYXBwZW5kQ2hpbGQodGhpcy5zdmcpLHRoaXMub3B0aW9ucy5kYXRhQXhpcy5vcmllbnRhdGlvbj0ibGVmdCIsdGhpcy55QXhpc0xlZnQ9bmV3IHUodGhpcy5ib2R5LHRoaXMub3B0aW9ucy5kYXRhQXhpcyx0aGlzLnN2Zyx0aGlzLm9wdGlvbnMuZ3JvdXBzKSx0aGlzLm9wdGlvbnMuZGF0YUF4aXMub3JpZW50YXRpb249InJpZ2h0Iix0aGlzLnlBeGlzUmlnaHQ9bmV3IHUodGhpcy5ib2R5LHRoaXMub3B0aW9ucy5kYXRhQXhpcyx0aGlzLnN2Zyx0aGlzLm9wdGlvbnMuZ3JvdXBzKSxkZWxldGUgdGhpcy5vcHRpb25zLmRhdGFBeGlzLm9yaWVudGF0aW9uLHRoaXMubGVnZW5kTGVmdD1uZXcgcCh0aGlzLmJvZHksdGhpcy5vcHRpb25zLmxlZ2VuZCwibGVmdCIsdGhpcy5vcHRpb25zLmdyb3VwcyksdGhpcy5sZWdlbmRSaWdodD1uZXcgcCh0aGlzLmJvZHksdGhpcy5vcHRpb25zLmxlZ2VuZCwicmlnaHQiLHRoaXMub3B0aW9ucy5ncm91cHMpLHRoaXMuc2hvdygpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPVsic2FtcGxpbmciLCJkZWZhdWx0R3JvdXAiLCJzdGFjayIsImhlaWdodCIsImdyYXBoSGVpZ2h0IiwieUF4aXNPcmllbnRhdGlvbiIsInN0eWxlIiwiYmFyQ2hhcnQiLCJkYXRhQXhpcyIsInNvcnQiLCJncm91cHMiXTt2b2lkIDA9PT10LmdyYXBoSGVpZ2h0JiZ2b2lkIDAhPT10LmhlaWdodD8odGhpcy51cGRhdGVTVkdoZWlnaHQ9ITAsdGhpcy51cGRhdGVTVkdoZWlnaHRPblJlc2l6ZT0hMCk6dm9pZCAwIT09dGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQmJnZvaWQgMCE9PXQuZ3JhcGhIZWlnaHQmJnBhcnNlSW50KCh0LmdyYXBoSGVpZ2h0KyIiKS5yZXBsYWNlKCJweCIsIiIpKTx0aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodCYmKHRoaXMudXBkYXRlU1ZHaGVpZ2h0PSEwKSxyLnNlbGVjdGl2ZURlZXBFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCksci5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsImludGVycG9sYXRpb24iKSxyLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCwiZHJhd1BvaW50cyIpLHIubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LCJzaGFkZWQiKSxyLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCwibGVnZW5kIiksdC5pbnRlcnBvbGF0aW9uJiYib2JqZWN0Ij09KDAscy5kZWZhdWx0KSh0LmludGVycG9sYXRpb24pJiZ0LmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uJiYoInVuaWZvcm0iPT10LmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uP3RoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhPTA6ImNob3JkYWwiPT10LmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uP3RoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhPTE6KHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbj0iY2VudHJpcGV0YWwiLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhPS41KSksdGhpcy55QXhpc0xlZnQmJnZvaWQgMCE9PXQuZGF0YUF4aXMmJih0aGlzLnlBeGlzTGVmdC5zZXRPcHRpb25zKHRoaXMub3B0aW9ucy5kYXRhQXhpcyksdGhpcy55QXhpc1JpZ2h0LnNldE9wdGlvbnModGhpcy5vcHRpb25zLmRhdGFBeGlzKSksdGhpcy5sZWdlbmRMZWZ0JiZ2b2lkIDAhPT10LmxlZ2VuZCYmKHRoaXMubGVnZW5kTGVmdC5zZXRPcHRpb25zKHRoaXMub3B0aW9ucy5sZWdlbmQpLHRoaXMubGVnZW5kUmlnaHQuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMubGVnZW5kKSksdGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkoIl9fdW5ncm91cGVkX18iKSYmdGhpcy5ncm91cHMuX191bmdyb3VwZWRfXy5zZXRPcHRpb25zKHQpfXRoaXMuZG9tLmZyYW1lJiYodGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiLHtxdWV1ZTohMH0pKX0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5jZW50ZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpfSxvLnByb3RvdHlwZS5zZXRJdGVtcz1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMsbz10aGlzLml0ZW1zRGF0YTtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBofHx0IGluc3RhbmNlb2YgZCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGF0YSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIERhdGFTZXQgb3IgRGF0YVZpZXciKTt0aGlzLml0ZW1zRGF0YT10fWVsc2UgdGhpcy5pdGVtc0RhdGE9bnVsbDtpZihvJiYoci5mb3JFYWNoKHRoaXMuaXRlbUxpc3RlbmVycyxmdW5jdGlvbih0LGUpe28ub2ZmKGUsdCl9KSxlPW8uZ2V0SWRzKCksdGhpcy5fb25SZW1vdmUoZSkpLHRoaXMuaXRlbXNEYXRhKXt2YXIgbj10aGlzLmlkO3IuZm9yRWFjaCh0aGlzLml0ZW1MaXN0ZW5lcnMsZnVuY3Rpb24odCxlKXtpLml0ZW1zRGF0YS5vbihlLHQsbil9KSxlPXRoaXMuaXRlbXNEYXRhLmdldElkcygpLHRoaXMuX29uQWRkKGUpfX0sby5wcm90b3R5cGUuc2V0R3JvdXBzPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcztpZih0aGlzLmdyb3Vwc0RhdGEpe3IuZm9yRWFjaCh0aGlzLmdyb3VwTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7aS5ncm91cHNEYXRhLm9mZihlLHQpfSksZT10aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKCksdGhpcy5ncm91cHNEYXRhPW51bGw7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDtvKyspdGhpcy5fcmVtb3ZlR3JvdXAoZVtvXSl9aWYodCl7aWYoISh0IGluc3RhbmNlb2YgaHx8dCBpbnN0YW5jZW9mIGQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkRhdGEgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBEYXRhU2V0IG9yIERhdGFWaWV3Iik7dGhpcy5ncm91cHNEYXRhPXR9ZWxzZSB0aGlzLmdyb3Vwc0RhdGE9bnVsbDtpZih0aGlzLmdyb3Vwc0RhdGEpe3ZhciBuPXRoaXMuaWQ7ci5mb3JFYWNoKHRoaXMuZ3JvdXBMaXN0ZW5lcnMsZnVuY3Rpb24odCxlKXtpLmdyb3Vwc0RhdGEub24oZSx0LG4pfSksZT10aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKCksdGhpcy5fb25BZGRHcm91cHMoZSl9fSxvLnByb3RvdHlwZS5fb25VcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlQWxsR3JvdXBEYXRhKHQpfSxvLnByb3RvdHlwZS5fb25BZGQ9ZnVuY3Rpb24odCl7dGhpcy5fb25VcGRhdGUodCl9LG8ucHJvdG90eXBlLl9vblJlbW92ZT1mdW5jdGlvbih0KXt0aGlzLl9vblVwZGF0ZSh0KX0sby5wcm90b3R5cGUuX29uVXBkYXRlR3JvdXBzPWZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZUFsbEdyb3VwRGF0YShudWxsLHQpfSxvLnByb3RvdHlwZS5fb25BZGRHcm91cHM9ZnVuY3Rpb24odCl7dGhpcy5fb25VcGRhdGVHcm91cHModCl9LApvLnByb3RvdHlwZS5fb25SZW1vdmVHcm91cHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy5fcmVtb3ZlR3JvdXAodFtlXSk7dGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiLHtxdWV1ZTohMH0pfSxvLnByb3RvdHlwZS5fcmVtb3ZlR3JvdXA9ZnVuY3Rpb24odCl7dGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkodCkmJigicmlnaHQiPT10aGlzLmdyb3Vwc1t0XS5vcHRpb25zLnlBeGlzT3JpZW50YXRpb24/KHRoaXMueUF4aXNSaWdodC5yZW1vdmVHcm91cCh0KSx0aGlzLmxlZ2VuZFJpZ2h0LnJlbW92ZUdyb3VwKHQpLHRoaXMubGVnZW5kUmlnaHQucmVkcmF3KCkpOih0aGlzLnlBeGlzTGVmdC5yZW1vdmVHcm91cCh0KSx0aGlzLmxlZ2VuZExlZnQucmVtb3ZlR3JvdXAodCksdGhpcy5sZWdlbmRMZWZ0LnJlZHJhdygpKSxkZWxldGUgdGhpcy5ncm91cHNbdF0pfSxvLnByb3RvdHlwZS5fdXBkYXRlR3JvdXA9ZnVuY3Rpb24odCxlKXt0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShlKT8odGhpcy5ncm91cHNbZV0udXBkYXRlKHQpLCJyaWdodCI9PXRoaXMuZ3JvdXBzW2VdLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbj8odGhpcy55QXhpc1JpZ2h0LnVwZGF0ZUdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMubGVnZW5kUmlnaHQudXBkYXRlR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSksdGhpcy55QXhpc0xlZnQucmVtb3ZlR3JvdXAoZSksdGhpcy5sZWdlbmRMZWZ0LnJlbW92ZUdyb3VwKGUpKToodGhpcy55QXhpc0xlZnQudXBkYXRlR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSksdGhpcy5sZWdlbmRMZWZ0LnVwZGF0ZUdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMueUF4aXNSaWdodC5yZW1vdmVHcm91cChlKSx0aGlzLmxlZ2VuZFJpZ2h0LnJlbW92ZUdyb3VwKGUpKSk6KHRoaXMuZ3JvdXBzW2VdPW5ldyBjKHQsZSx0aGlzLm9wdGlvbnMsdGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXMpLCJyaWdodCI9PXRoaXMuZ3JvdXBzW2VdLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbj8odGhpcy55QXhpc1JpZ2h0LmFkZEdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMubGVnZW5kUmlnaHQuYWRkR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSkpOih0aGlzLnlBeGlzTGVmdC5hZGRHcm91cChlLHRoaXMuZ3JvdXBzW2VdKSx0aGlzLmxlZ2VuZExlZnQuYWRkR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSkpKSx0aGlzLmxlZ2VuZExlZnQucmVkcmF3KCksdGhpcy5sZWdlbmRSaWdodC5yZWRyYXcoKX0sby5wcm90b3R5cGUuX3VwZGF0ZUFsbEdyb3VwRGF0YT1mdW5jdGlvbih0LGUpe2lmKG51bGwhPXRoaXMuaXRlbXNEYXRhKXt2YXIgaT17fSxvPXRoaXMuaXRlbXNEYXRhLmdldCgpLG49dGhpcy5pdGVtc0RhdGEuX2ZpZWxkSWQscz17fTt0JiZ0Lm1hcChmdW5jdGlvbih0KXtzW3RdPXR9KTtmb3IodmFyIGE9e30saD0wO2g8by5sZW5ndGg7aCsrKXt2YXIgZD1vW2hdLGw9ZC5ncm91cDtudWxsIT09bCYmdm9pZCAwIT09bHx8KGw9Il9fdW5ncm91cGVkX18iKSxhLmhhc093blByb3BlcnR5KGwpP2FbbF0rKzphW2xdPTF9dmFyIHU9e307aWYoIWUmJnQpZm9yKHZhciBsIGluIHRoaXMuZ3JvdXBzKWlmKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGwpKXt2YXIgYz10aGlzLmdyb3Vwc1tsXSxwPWMuZ2V0SXRlbXMoKTtpW2xdPXAuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB1W3Rbbl1dPXRbbl0sdFtuXSE9PXNbdFtuXV19KTt2YXIgZj1hW2xdO2FbbF0tPWlbbF0ubGVuZ3RoLGlbbF0ubGVuZ3RoPGYmJihpW2xdW2YtMV09e30pfWZvcih2YXIgaD0wO2g8by5sZW5ndGg7aCsrKXt2YXIgZD1vW2hdLGw9ZC5ncm91cDtpZihudWxsIT09bCYmdm9pZCAwIT09bHx8KGw9Il9fdW5ncm91cGVkX18iKSxlfHwhdHx8ZFtuXT09PXNbZFtuXV18fCF1Lmhhc093blByb3BlcnR5KGRbbl0pKXtpLmhhc093blByb3BlcnR5KGwpfHwoaVtsXT1uZXcgQXJyYXkoYVtsXSkpO3ZhciBtPXIuYnJpZGdlT2JqZWN0KGQpO20ueD1yLmNvbnZlcnQoZC54LCJEYXRlIiksbS5lbmQ9ci5jb252ZXJ0KGQuZW5kLCJEYXRlIiksbS5vcmdpbmFsWT1kLnksbS55PU51bWJlcihkLnkpLG1bbl09ZFtuXTt2YXIgdj1pW2xdLmxlbmd0aC1hW2xdLS07aVtsXVt2XT1tfX1mb3IodmFyIGwgaW4gdGhpcy5ncm91cHMpdGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkobCkmJihpLmhhc093blByb3BlcnR5KGwpfHwoaVtsXT1uZXcgQXJyYXkoMCkpKTtmb3IodmFyIGwgaW4gaSlpZihpLmhhc093blByb3BlcnR5KGwpKWlmKDA9PWlbbF0ubGVuZ3RoKXRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGwpJiZ0aGlzLl9yZW1vdmVHcm91cChsKTtlbHNle3ZhciBjPXZvaWQgMDt2b2lkIDAhPXRoaXMuZ3JvdXBzRGF0YSYmKGM9dGhpcy5ncm91cHNEYXRhLmdldChsKSksdm9pZCAwPT1jJiYoYz17aWQ6bCxjb250ZW50OnRoaXMub3B0aW9ucy5kZWZhdWx0R3JvdXArbH0pLHRoaXMuX3VwZGF0ZUdyb3VwKGMsbCksdGhpcy5ncm91cHNbbF0uc2V0SXRlbXMoaVtsXSl9dGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiLHtxdWV1ZTohMH0pfX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9ITE7dGhpcy5wcm9wcy53aWR0aD10aGlzLmRvbS5mcmFtZS5vZmZzZXRXaWR0aCx0aGlzLnByb3BzLmhlaWdodD10aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodC10aGlzLmJvZHkuZG9tUHJvcHMuYm9yZGVyLnRvcC10aGlzLmJvZHkuZG9tUHJvcHMuYm9yZGVyLmJvdHRvbSx0PXRoaXMuX2lzUmVzaXplZCgpfHx0O3ZhciBlPXRoaXMuYm9keS5yYW5nZS5lbmQtdGhpcy5ib2R5LnJhbmdlLnN0YXJ0LGk9ZSE9dGhpcy5sYXN0VmlzaWJsZUludGVydmFsO2lmKHRoaXMubGFzdFZpc2libGVJbnRlcnZhbD1lLDE9PXQmJih0aGlzLnN2Zy5zdHlsZS53aWR0aD1yLm9wdGlvbi5hc1NpemUoMyp0aGlzLnByb3BzLndpZHRoKSx0aGlzLnN2Zy5zdHlsZS5sZWZ0PXIub3B0aW9uLmFzU2l6ZSgtdGhpcy5wcm9wcy53aWR0aCksLTE9PSh0aGlzLm9wdGlvbnMuaGVpZ2h0KyIiKS5pbmRleE9mKCIlIikmJjEhPXRoaXMudXBkYXRlU1ZHaGVpZ2h0T25SZXNpemV8fCh0aGlzLnVwZGF0ZVNWR2hlaWdodD0hMCkpLDE9PXRoaXMudXBkYXRlU1ZHaGVpZ2h0Pyh0aGlzLm9wdGlvbnMuZ3JhcGhIZWlnaHQhPXRoaXMucHJvcHMuaGVpZ2h0KyJweCImJih0aGlzLm9wdGlvbnMuZ3JhcGhIZWlnaHQ9dGhpcy5wcm9wcy5oZWlnaHQrInB4Iix0aGlzLnN2Zy5zdHlsZS5oZWlnaHQ9dGhpcy5wcm9wcy5oZWlnaHQrInB4IiksdGhpcy51cGRhdGVTVkdoZWlnaHQ9ITEpOnRoaXMuc3ZnLnN0eWxlLmhlaWdodD0oIiIrdGhpcy5vcHRpb25zLmdyYXBoSGVpZ2h0KS5yZXBsYWNlKCJweCIsIiIpKyJweCIsMT09dHx8MT09aXx8MT09dGhpcy5hYm9ydGVkR3JhcGhVcGRhdGV8fDE9PXRoaXMuZm9yY2VHcmFwaFVwZGF0ZSl0PXRoaXMuX3VwZGF0ZUdyYXBoKCl8fHQsdGhpcy5mb3JjZUdyYXBoVXBkYXRlPSExO2Vsc2UgaWYoMCE9dGhpcy5sYXN0U3RhcnQpe3ZhciBvPXRoaXMuYm9keS5yYW5nZS5zdGFydC10aGlzLmxhc3RTdGFydCxuPXRoaXMuYm9keS5yYW5nZS5lbmQtdGhpcy5ib2R5LnJhbmdlLnN0YXJ0O2lmKDAhPXRoaXMucHJvcHMud2lkdGgpe3ZhciBzPXRoaXMucHJvcHMud2lkdGgvbixhPW8qczt0aGlzLnN2Zy5zdHlsZS5sZWZ0PS10aGlzLnByb3BzLndpZHRoLWErInB4In19cmV0dXJuIHRoaXMubGVnZW5kTGVmdC5yZWRyYXcoKSx0aGlzLmxlZ2VuZFJpZ2h0LnJlZHJhdygpLHR9LG8ucHJvdG90eXBlLl9nZXRTb3J0ZWRHcm91cElkcz1mdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzLmdyb3VwcylpZih0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIGk9dGhpcy5ncm91cHNbZV07MSE9aS52aXNpYmxlfHx2b2lkIDAhPT10aGlzLm9wdGlvbnMuZ3JvdXBzLnZpc2liaWxpdHlbZV0mJjEhPXRoaXMub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVtlXXx8dC5wdXNoKHtpZDplLHpJbmRleDppLm9wdGlvbnMuekluZGV4fSl9ci5pbnNlcnRTb3J0KHQsZnVuY3Rpb24odCxlKXt2YXIgaT10LnpJbmRleCxvPWUuekluZGV4O3JldHVybiB2b2lkIDA9PT1pJiYoaT0wKSx2b2lkIDA9PT1vJiYobz0wKSxpPT1vPzA6aTxvPy0xOjF9KTtmb3IodmFyIG89bmV3IEFycmF5KHQubGVuZ3RoKSxuPTA7bjx0Lmxlbmd0aDtuKyspb1tuXT10W25dLmlkO3JldHVybiBvfSxvLnByb3RvdHlwZS5fdXBkYXRlR3JhcGg9ZnVuY3Rpb24oKXtpZihhLnByZXBhcmVFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKSwwIT10aGlzLnByb3BzLndpZHRoJiZudWxsIT10aGlzLml0ZW1zRGF0YSl7dmFyIHQsZSxpPXt9LG89dGhpcy5ib2R5LnV0aWwudG9HbG9iYWxUaW1lKC10aGlzLmJvZHkuZG9tUHJvcHMucm9vdC53aWR0aCksbj10aGlzLmJvZHkudXRpbC50b0dsb2JhbFRpbWUoMip0aGlzLmJvZHkuZG9tUHJvcHMucm9vdC53aWR0aCkscz10aGlzLl9nZXRTb3J0ZWRHcm91cElkcygpO2lmKHMubGVuZ3RoPjApe3ZhciByPXt9O2Zvcih0aGlzLl9nZXRSZWxldmFudERhdGEocyxyLG8sbiksdGhpcy5fYXBwbHlTYW1wbGluZyhzLHIpLGU9MDtlPHMubGVuZ3RoO2UrKyl0aGlzLl9jb252ZXJ0WGNvb3JkaW5hdGVzKHJbc1tlXV0pO2lmKHRoaXMuX2dldFlSYW5nZXMocyxyLGkpLDE9PXRoaXMuX3VwZGF0ZVlBeGlzKHMsaSkpcmV0dXJuIGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpLHRoaXMuYWJvcnRlZEdyYXBoVXBkYXRlPSEwLCEwO3RoaXMuYWJvcnRlZEdyYXBoVXBkYXRlPSExO3ZhciBoPXZvaWQgMDtmb3IoZT0wO2U8cy5sZW5ndGg7ZSsrKXQ9dGhpcy5ncm91cHNbc1tlXV0sITA9PT10aGlzLm9wdGlvbnMuc3RhY2smJiJsaW5lIj09PXRoaXMub3B0aW9ucy5zdHlsZSYmKHZvaWQgMCE9dC5vcHRpb25zLmV4Y2x1ZGVGcm9tU3RhY2tpbmcmJnQub3B0aW9ucy5leGNsdWRlRnJvbVN0YWNraW5nfHwodm9pZCAwIT1oJiYodGhpcy5fc3RhY2soclt0LmlkXSxyW2guaWRdKSwxPT10Lm9wdGlvbnMuc2hhZGVkLmVuYWJsZWQmJiJncm91cCIhPT10Lm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uJiYoInRvcCI9PXQub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24mJiJncm91cCIhPT1oLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uPyhoLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uPSJncm91cCIsaC5vcHRpb25zLnNoYWRlZC5ncm91cElkPXQuaWQpOih0Lm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uPSJncm91cCIsdC5vcHRpb25zLnNoYWRlZC5ncm91cElkPWguaWQpKSksaD10KSksdGhpcy5fY29udmVydFljb29yZGluYXRlcyhyW3NbZV1dLHQpO3ZhciBkPXt9O2ZvcihlPTA7ZTxzLmxlbmd0aDtlKyspaWYodD10aGlzLmdyb3Vwc1tzW2VdXSwibGluZSI9PT10Lm9wdGlvbnMuc3R5bGUmJjE9PXQub3B0aW9ucy5zaGFkZWQuZW5hYmxlZCl7dmFyIGw9cltzW2VdXTtpZihudWxsPT1sfHwwPT1sLmxlbmd0aCljb250aW51ZTtpZihkLmhhc093blByb3BlcnR5KHNbZV0pfHwoZFtzW2VdXT1tLmNhbGNQYXRoKGwsdCkpLCJncm91cCI9PT10Lm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uKXt2YXIgdT10Lm9wdGlvbnMuc2hhZGVkLmdyb3VwSWQ7aWYoLTE9PT1zLmluZGV4T2YodSkpe2NvbnNvbGUubG9nKHQuaWQrIjogVW5rbm93biBzaGFkaW5nIGdyb3VwIHRhcmdldCBnaXZlbjoiK3UpO2NvbnRpbnVlfWQuaGFzT3duUHJvcGVydHkodSl8fChkW3VdPW0uY2FsY1BhdGgoclt1XSx0aGlzLmdyb3Vwc1t1XSkpLG0uZHJhd1NoYWRpbmcoZFtzW2VdXSx0LGRbdV0sdGhpcy5mcmFtZXdvcmspfWVsc2UgbS5kcmF3U2hhZGluZyhkW3NbZV1dLHQsdm9pZCAwLHRoaXMuZnJhbWV3b3JrKX1mb3IoZi5kcmF3KHMscix0aGlzLmZyYW1ld29yayksZT0wO2U8cy5sZW5ndGg7ZSsrKWlmKHQ9dGhpcy5ncm91cHNbc1tlXV0scltzW2VdXS5sZW5ndGg+MClzd2l0Y2godC5vcHRpb25zLnN0eWxlKXtjYXNlImxpbmUiOmQuaGFzT3duUHJvcGVydHkoc1tlXSl8fChkW3NbZV1dPW0uY2FsY1BhdGgocltzW2VdXSx0KSksbS5kcmF3KGRbc1tlXV0sdCx0aGlzLmZyYW1ld29yayk7Y2FzZSJwb2ludCI6Y2FzZSJwb2ludHMiOiJwb2ludCIhPXQub3B0aW9ucy5zdHlsZSYmInBvaW50cyIhPXQub3B0aW9ucy5zdHlsZSYmMSE9dC5vcHRpb25zLmRyYXdQb2ludHMuZW5hYmxlZHx8di5kcmF3KHJbc1tlXV0sdCx0aGlzLmZyYW1ld29yayl9fX1yZXR1cm4gYS5jbGVhbnVwRWxlbWVudHModGhpcy5zdmdFbGVtZW50cyksITF9LG8ucHJvdG90eXBlLl9zdGFjaz1mdW5jdGlvbih0LGUpe3ZhciBpLG8sbixzLHI7aT0wO2Zvcih2YXIgYT0wO2E8dC5sZW5ndGg7YSsrKXtzPXZvaWQgMCxyPXZvaWQgMDtmb3IodmFyIGg9aTtoPGUubGVuZ3RoO2grKyl7aWYoZVtoXS54PT09dFthXS54KXtzPWVbaF0scj1lW2hdLGk9aDticmVha31pZihlW2hdLng+dFthXS54KXtyPWVbaF0scz0wPT1oP3I6ZVtoLTFdLGk9aDticmVha319dm9pZCAwPT09ciYmKHM9ZVtlLmxlbmd0aC0xXSxyPWVbZS5sZW5ndGgtMV0pLG89ci54LXMueCxuPXIueS1zLnksdFthXS55PTA9PW8/dFthXS5vcmdpbmFsWStyLnk6dFthXS5vcmdpbmFsWStuL28qKHRbYV0ueC1zLngpK3MueX19LG8ucHJvdG90eXBlLl9nZXRSZWxldmFudERhdGE9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG4scyxhLGg7aWYodC5sZW5ndGg+MClmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXtuPXRoaXMuZ3JvdXBzW3Rbc11dO3ZhciBkPW4uZ2V0SXRlbXMoKTtpZigxPT1uLm9wdGlvbnMuc29ydCl7dmFyIGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5nZXRUaW1lKCk9PWUuZ2V0VGltZSgpPzA6dDxlPy0xOjF9LHU9TWF0aC5tYXgoMCxyLmJpbmFyeVNlYXJjaFZhbHVlKGQsaSwieCIsImJlZm9yZSIsbCkpLGM9TWF0aC5taW4oZC5sZW5ndGgsci5iaW5hcnlTZWFyY2hWYWx1ZShkLG8sIngiLCJhZnRlciIsbCkrMSk7Yzw9MCYmKGM9ZC5sZW5ndGgpO3ZhciBwPW5ldyBBcnJheShjLXUpO2ZvcihhPXU7YTxjO2ErKyloPW4uaXRlbXNEYXRhW2FdLHBbYS11XT1oO2VbdFtzXV09cH1lbHNlIGVbdFtzXV09bi5pdGVtc0RhdGF9fSxvLnByb3RvdHlwZS5fYXBwbHlTYW1wbGluZz1mdW5jdGlvbih0LGUpe3ZhciBpO2lmKHQubGVuZ3RoPjApZm9yKHZhciBvPTA7bzx0Lmxlbmd0aDtvKyspaWYoaT10aGlzLmdyb3Vwc1t0W29dXSwxPT1pLm9wdGlvbnMuc2FtcGxpbmcpe3ZhciBuPWVbdFtvXV07aWYobi5sZW5ndGg+MCl7dmFyIHM9MSxyPW4ubGVuZ3RoLGE9dGhpcy5ib2R5LnV0aWwudG9HbG9iYWxTY3JlZW4obltuLmxlbmd0aC0xXS54KS10aGlzLmJvZHkudXRpbC50b0dsb2JhbFNjcmVlbihuWzBdLngpLGg9ci9hO3M9TWF0aC5taW4oTWF0aC5jZWlsKC4yKnIpLE1hdGgubWF4KDEsTWF0aC5yb3VuZChoKSkpO2Zvcih2YXIgZD1uZXcgQXJyYXkociksbD0wO2w8cjtsKz1zKXt2YXIgdT1NYXRoLnJvdW5kKGwvcyk7ZFt1XT1uW2xdfWVbdFtvXV09ZC5zcGxpY2UoMCxNYXRoLnJvdW5kKHIvcykpfX19LG8ucHJvdG90eXBlLl9nZXRZUmFuZ2VzPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbyxuLHMscixhPVtdLGg9W107aWYodC5sZW5ndGg+MCl7Zm9yKHM9MDtzPHQubGVuZ3RoO3MrKylvPWVbdFtzXV0scj10aGlzLmdyb3Vwc1t0W3NdXS5vcHRpb25zLG8ubGVuZ3RoPjAmJihuPXRoaXMuZ3JvdXBzW3Rbc11dLCEwPT09ci5zdGFjayYmImJhciI9PT1yLnN0eWxlPyJsZWZ0Ij09PXIueUF4aXNPcmllbnRhdGlvbj9hPWEuY29uY2F0KG8pOmg9aC5jb25jYXQobyk6aVt0W3NdXT1uLmdldFlSYW5nZShvLHRbc10pKTtmLmdldFN0YWNrZWRZUmFuZ2UoYSxpLHQsIl9fYmFyU3RhY2tMZWZ0IiwibGVmdCIpLGYuZ2V0U3RhY2tlZFlSYW5nZShoLGksdCwiX19iYXJTdGFja1JpZ2h0IiwicmlnaHQiKX19LG8ucHJvdG90eXBlLl91cGRhdGVZQXhpcz1mdW5jdGlvbih0LGUpe3ZhciBpLG8sbj0hMSxzPSExLHI9ITEsYT0xZTksaD0xZTksZD0tMWU5LGw9LTFlOTtpZih0Lmxlbmd0aD4wKXtmb3IodmFyIHU9MDt1PHQubGVuZ3RoO3UrKyl7dmFyIGM9dGhpcy5ncm91cHNbdFt1XV07YyYmInJpZ2h0IiE9Yy5vcHRpb25zLnlBeGlzT3JpZW50YXRpb24/KHM9ITAsYT0xZTksZD0tMWU5KTpjJiZjLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbiYmKHI9ITAsaD0xZTksbD0tMWU5KX1mb3IodmFyIHU9MDt1PHQubGVuZ3RoO3UrKyllLmhhc093blByb3BlcnR5KHRbdV0pJiYhMCE9PWVbdFt1XV0uaWdub3JlJiYoaT1lW3RbdV1dLm1pbixvPWVbdFt1XV0ubWF4LCJyaWdodCIhPWVbdFt1XV0ueUF4aXNPcmllbnRhdGlvbj8ocz0hMCxhPWE+aT9pOmEsZD1kPG8/bzpkKToocj0hMCxoPWg+aT9pOmgsbD1sPG8/bzpsKSk7MT09cyYmdGhpcy55QXhpc0xlZnQuc2V0UmFuZ2UoYSxkKSwxPT1yJiZ0aGlzLnlBeGlzUmlnaHQuc2V0UmFuZ2UoaCxsKX1uPXRoaXMuX3RvZ2dsZUF4aXNWaXNpYmxpdHkocyx0aGlzLnlBeGlzTGVmdCl8fG4sbj10aGlzLl90b2dnbGVBeGlzVmlzaWJsaXR5KHIsdGhpcy55QXhpc1JpZ2h0KXx8biwxPT1yJiYxPT1zPyh0aGlzLnlBeGlzTGVmdC5kcmF3SWNvbnM9ITAsdGhpcy55QXhpc1JpZ2h0LmRyYXdJY29ucz0hMCk6KHRoaXMueUF4aXNMZWZ0LmRyYXdJY29ucz0hMSx0aGlzLnlBeGlzUmlnaHQuZHJhd0ljb25zPSExKSx0aGlzLnlBeGlzUmlnaHQubWFzdGVyPSFzLHRoaXMueUF4aXNSaWdodC5tYXN0ZXJBeGlzPXRoaXMueUF4aXNMZWZ0LDA9PXRoaXMueUF4aXNSaWdodC5tYXN0ZXI/KHRoaXMueUF4aXNMZWZ0LmxpbmVPZmZzZXQ9MT09cj90aGlzLnlBeGlzUmlnaHQud2lkdGg6MCxuPXRoaXMueUF4aXNMZWZ0LnJlZHJhdygpfHxuLG49dGhpcy55QXhpc1JpZ2h0LnJlZHJhdygpfHxuKTpuPXRoaXMueUF4aXNSaWdodC5yZWRyYXcoKXx8bjtmb3IodmFyIHA9WyJfX2JhclN0YWNrTGVmdCIsIl9fYmFyU3RhY2tSaWdodCIsIl9fbGluZVN0YWNrTGVmdCIsIl9fbGluZVN0YWNrUmlnaHQiXSx1PTA7dTxwLmxlbmd0aDt1KyspLTEhPXQuaW5kZXhPZihwW3VdKSYmdC5zcGxpY2UodC5pbmRleE9mKHBbdV0pLDEpO3JldHVybiBufSxvLnByb3RvdHlwZS5fdG9nZ2xlQXhpc1Zpc2libGl0eT1mdW5jdGlvbih0LGUpe3ZhciBpPSExO3JldHVybiAwPT10P2UuZG9tLmZyYW1lLnBhcmVudE5vZGUmJjA9PWUuaGlkZGVuJiYoZS5oaWRlKCksaT0hMCk6ZS5kb20uZnJhbWUucGFyZW50Tm9kZXx8MSE9ZS5oaWRkZW58fChlLnNob3coKSxpPSEwKSxpfSxvLnByb3RvdHlwZS5fY29udmVydFhjb29yZGluYXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4saT0wO2k8dC5sZW5ndGg7aSsrKXRbaV0uc2NyZWVuX3g9ZSh0W2ldLngpK3RoaXMucHJvcHMud2lkdGgsdFtpXS5zY3JlZW5feT10W2ldLnksdm9pZCAwIT10W2ldLmVuZD90W2ldLnNjcmVlbl9lbmQ9ZSh0W2ldLmVuZCkrdGhpcy5wcm9wcy53aWR0aDp0W2ldLnNjcmVlbl9lbmQ9dm9pZCAwfSxvLnByb3RvdHlwZS5fY29udmVydFljb29yZGluYXRlcz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMueUF4aXNMZWZ0LG89TnVtYmVyKHRoaXMuc3ZnLnN0eWxlLmhlaWdodC5yZXBsYWNlKCJweCIsIiIpKTsicmlnaHQiPT1lLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbiYmKGk9dGhpcy55QXhpc1JpZ2h0KTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0W25dLnNjcmVlbl95PU1hdGgucm91bmQoaS5jb252ZXJ0VmFsdWUodFtuXS55KSk7ZS5zZXRaZXJvUG9zaXRpb24oTWF0aC5taW4obyxpLmNvbnZlcnRWYWx1ZSgwKSkpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGksbyl7dGhpcy5pZD1yLnJhbmRvbVVVSUQoKSx0aGlzLmJvZHk9dCx0aGlzLmRlZmF1bHRPcHRpb25zPXtvcmllbnRhdGlvbjoibGVmdCIsc2hvd01pbm9yTGFiZWxzOiEwLHNob3dNYWpvckxhYmVsczohMCxpY29uczohMSxtYWpvckxpbmVzT2Zmc2V0OjcsbWlub3JMaW5lc09mZnNldDo0LGxhYmVsT2Zmc2V0WDoxMCxsYWJlbE9mZnNldFk6MixpY29uV2lkdGg6MjAsd2lkdGg6IjQwcHgiLHZpc2libGU6ITAsYWxpZ25aZXJvczohMCxsZWZ0OntyYW5nZTp7bWluOnZvaWQgMCxtYXg6dm9pZCAwfSxmb3JtYXQ6ZnVuY3Rpb24odCl7cmV0dXJuIiIrcGFyc2VGbG9hdCh0LnRvUHJlY2lzaW9uKDMpKX0sdGl0bGU6e3RleHQ6dm9pZCAwLHN0eWxlOnZvaWQgMH19LHJpZ2h0OntyYW5nZTp7bWluOnZvaWQgMCxtYXg6dm9pZCAwfSxmb3JtYXQ6ZnVuY3Rpb24odCl7cmV0dXJuIiIrcGFyc2VGbG9hdCh0LnRvUHJlY2lzaW9uKDMpKX0sdGl0bGU6e3RleHQ6dm9pZCAwLHN0eWxlOnZvaWQgMH19fSx0aGlzLmxpbmVncmFwaE9wdGlvbnM9byx0aGlzLmxpbmVncmFwaFNWRz1pLHRoaXMucHJvcHM9e30sdGhpcy5ET01lbGVtZW50cz17bGluZXM6e30sbGFiZWxzOnt9LHRpdGxlOnt9fSx0aGlzLmRvbT17fSx0aGlzLnNjYWxlPXZvaWQgMCx0aGlzLnJhbmdlPXtzdGFydDowLGVuZDowfSx0aGlzLm9wdGlvbnM9ci5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5jb252ZXJzaW9uRmFjdG9yPTEsdGhpcy5zZXRPcHRpb25zKGUpLHRoaXMud2lkdGg9TnVtYmVyKCgiIit0aGlzLm9wdGlvbnMud2lkdGgpLnJlcGxhY2UoInB4IiwiIikpLHRoaXMubWluV2lkdGg9dGhpcy53aWR0aCx0aGlzLmhlaWdodD10aGlzLmxpbmVncmFwaFNWRy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQsdGhpcy5oaWRkZW49ITEsdGhpcy5zdGVwUGl4ZWxzPTI1LHRoaXMuemVyb0Nyb3NzaW5nPS0xLHRoaXMuYW1vdW50T2ZTdGVwcz0tMSx0aGlzLmxpbmVPZmZzZXQ9MCx0aGlzLm1hc3Rlcj0hMCx0aGlzLm1hc3RlckF4aXM9bnVsbCx0aGlzLnN2Z0VsZW1lbnRzPXt9LHRoaXMuaWNvbnNSZW1vdmVkPSExLHRoaXMuZ3JvdXBzPXt9LHRoaXMuYW1vdW50T2ZHcm91cHM9MCx0aGlzLl9jcmVhdGUoKSx0aGlzLmZyYW1ld29yaz17c3ZnOnRoaXMuc3ZnLHN2Z0VsZW1lbnRzOnRoaXMuc3ZnRWxlbWVudHMsb3B0aW9uczp0aGlzLm9wdGlvbnMsZ3JvdXBzOnRoaXMuZ3JvdXBzfTt2YXIgbj10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKCJ2ZXJ0aWNhbERyYWciLGZ1bmN0aW9uKCl7bi5kb20ubGluZUNvbnRhaW5lci5zdHlsZS50b3A9bi5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcCsicHgifSl9dmFyIG49aSg1OCkscz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KG4pLHI9aSgxKSxhPWkoODgpLGg9aSgxMjApLGQ9aSgxNTEpO28ucHJvdG90eXBlPW5ldyBoLG8ucHJvdG90eXBlLmFkZEdyb3VwPWZ1bmN0aW9uKHQsZSl7dGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkodCl8fCh0aGlzLmdyb3Vwc1t0XT1lKSx0aGlzLmFtb3VudE9mR3JvdXBzKz0xfSxvLnByb3RvdHlwZS51cGRhdGVHcm91cD1mdW5jdGlvbih0LGUpe3RoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5hbW91bnRPZkdyb3Vwcys9MSksdGhpcy5ncm91cHNbdF09ZX0sby5wcm90b3R5cGUucmVtb3ZlR3JvdXA9ZnVuY3Rpb24odCl7dGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkodCkmJihkZWxldGUgdGhpcy5ncm91cHNbdF0sdGhpcy5hbW91bnRPZkdyb3Vwcy09MSl9LG8ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9ITE7dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uIT10Lm9yaWVudGF0aW9uJiZ2b2lkIDAhPT10Lm9yaWVudGF0aW9uJiYoZT0hMCk7dmFyIGk9WyJvcmllbnRhdGlvbiIsInNob3dNaW5vckxhYmVscyIsInNob3dNYWpvckxhYmVscyIsImljb25zIiwibWFqb3JMaW5lc09mZnNldCIsIm1pbm9yTGluZXNPZmZzZXQiLCJsYWJlbE9mZnNldFgiLCJsYWJlbE9mZnNldFkiLCJpY29uV2lkdGgiLCJ3aWR0aCIsInZpc2libGUiLCJsZWZ0IiwicmlnaHQiLCJhbGlnblplcm9zIl07ci5zZWxlY3RpdmVEZWVwRXh0ZW5kKGksdGhpcy5vcHRpb25zLHQpLHRoaXMubWluV2lkdGg9TnVtYmVyKCgiIit0aGlzLm9wdGlvbnMud2lkdGgpLnJlcGxhY2UoInB4IiwiIikpLCEwPT09ZSYmdGhpcy5kb20uZnJhbWUmJih0aGlzLmhpZGUoKSx0aGlzLnNob3coKSl9fSxvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uZnJhbWUuc3R5bGUud2lkdGg9dGhpcy5vcHRpb25zLndpZHRoLHRoaXMuZG9tLmZyYW1lLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCx0aGlzLmRvbS5saW5lQ29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUud2lkdGg9IjEwMCUiLHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0LHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLnN2Zz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwic3ZnIiksdGhpcy5zdmcuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnN2Zy5zdHlsZS50b3A9IjBweCIsdGhpcy5zdmcuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLnN2Zy5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5zdmcuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuc3ZnKX0sby5wcm90b3R5cGUuX3JlZHJhd0dyb3VwSWNvbnM9ZnVuY3Rpb24oKXthLnByZXBhcmVFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKTt2YXIgdCxlPXRoaXMub3B0aW9ucy5pY29uV2lkdGgsaT0xMS41O3Q9ImxlZnQiPT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uPzQ6dGhpcy53aWR0aC1lLTQ7dmFyIG89KDAscy5kZWZhdWx0KSh0aGlzLmdyb3Vwcyk7by5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMToxfSk7Zm9yKHZhciBuPTA7bjxvLmxlbmd0aDtuKyspe3ZhciByPW9bbl07ITAhPT10aGlzLmdyb3Vwc1tyXS52aXNpYmxlfHx2b2lkIDAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtyXSYmITAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtyXXx8KHRoaXMuZ3JvdXBzW3JdLmdldExlZ2VuZChlLDE1LHRoaXMuZnJhbWV3b3JrLHQsaSksaSs9MTkpfWEuY2xlYW51cEVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpLHRoaXMuaWNvbnNSZW1vdmVkPSExfSxvLnByb3RvdHlwZS5fY2xlYW51cEljb25zPWZ1bmN0aW9uKCl7ITE9PT10aGlzLmljb25zUmVtb3ZlZCYmKGEucHJlcGFyZUVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpLGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpLHRoaXMuaWNvbnNSZW1vdmVkPSEwKX0sby5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuaGlkZGVuPSExLHRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGV8fCgibGVmdCI9PT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24/dGhpcy5ib2R5LmRvbS5sZWZ0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmZyYW1lKTp0aGlzLmJvZHkuZG9tLnJpZ2h0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmZyYW1lKSksdGhpcy5kb20ubGluZUNvbnRhaW5lci5wYXJlbnROb2RlfHx0aGlzLmJvZHkuZG9tLmJhY2tncm91bmRIb3Jpem9udGFsLmFwcGVuZENoaWxkKHRoaXMuZG9tLmxpbmVDb250YWluZXIpfSxvLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7dGhpcy5oaWRkZW49ITAsdGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZSYmdGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5mcmFtZSksdGhpcy5kb20ubGluZUNvbnRhaW5lci5wYXJlbnROb2RlJiZ0aGlzLmRvbS5saW5lQ29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ubGluZUNvbnRhaW5lcil9LG8ucHJvdG90eXBlLnNldFJhbmdlPWZ1bmN0aW9uKHQsZSl7dGhpcy5yYW5nZS5zdGFydD10LHRoaXMucmFuZ2UuZW5kPWV9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3ZhciB0PSExLGU9MDt0aGlzLmRvbS5saW5lQ29udGFpbmVyLnN0eWxlLnRvcD10aGlzLmJvZHkuZG9tUHJvcHMuc2Nyb2xsVG9wKyJweCI7Zm9yKHZhciBpIGluIHRoaXMuZ3JvdXBzKXRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGkpJiYoITAhPT10aGlzLmdyb3Vwc1tpXS52aXNpYmxlfHx2b2lkIDAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtpXSYmITAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtpXXx8ZSsrKTtpZigwPT09dGhpcy5hbW91bnRPZkdyb3Vwc3x8MD09PWUpdGhpcy5oaWRlKCk7ZWxzZXt0aGlzLnNob3coKSx0aGlzLmhlaWdodD1OdW1iZXIodGhpcy5saW5lZ3JhcGhTVkcuc3R5bGUuaGVpZ2h0LnJlcGxhY2UoInB4IiwiIikpLHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0KyJweCIsdGhpcy53aWR0aD0hMD09PXRoaXMub3B0aW9ucy52aXNpYmxlP051bWJlcigoIiIrdGhpcy5vcHRpb25zLndpZHRoKS5yZXBsYWNlKCJweCIsIiIpKTowO3ZhciBvPXRoaXMucHJvcHMsbj10aGlzLmRvbS5mcmFtZTtuLmNsYXNzTmFtZT0idmlzLWRhdGEtYXhpcyIsdGhpcy5fY2FsY3VsYXRlQ2hhclNpemUoKTt2YXIgcz10aGlzLm9wdGlvbnMub3JpZW50YXRpb24scj10aGlzLm9wdGlvbnMuc2hvd01pbm9yTGFiZWxzLGE9dGhpcy5vcHRpb25zLnNob3dNYWpvckxhYmVscztvLm1pbm9yTGFiZWxIZWlnaHQ9cj9vLm1pbm9yQ2hhckhlaWdodDowLG8ubWFqb3JMYWJlbEhlaWdodD1hP28ubWFqb3JDaGFySGVpZ2h0OjAsby5taW5vckxpbmVXaWR0aD10aGlzLmJvZHkuZG9tLmJhY2tncm91bmRIb3Jpem9udGFsLm9mZnNldFdpZHRoLXRoaXMubGluZU9mZnNldC10aGlzLndpZHRoKzIqdGhpcy5vcHRpb25zLm1pbm9yTGluZXNPZmZzZXQsby5taW5vckxpbmVIZWlnaHQ9MSxvLm1ham9yTGluZVdpZHRoPXRoaXMuYm9keS5kb20uYmFja2dyb3VuZEhvcml6b250YWwub2Zmc2V0V2lkdGgtdGhpcy5saW5lT2Zmc2V0LXRoaXMud2lkdGgrMip0aGlzLm9wdGlvbnMubWFqb3JMaW5lc09mZnNldCxvLm1ham9yTGluZUhlaWdodD0xLCJsZWZ0Ij09PXM/KG4uc3R5bGUudG9wPSIwIixuLnN0eWxlLmxlZnQ9IjAiLG4uc3R5bGUuYm90dG9tPSIiLG4uc3R5bGUud2lkdGg9dGhpcy53aWR0aCsicHgiLG4uc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0KyJweCIsdGhpcy5wcm9wcy53aWR0aD10aGlzLmJvZHkuZG9tUHJvcHMubGVmdC53aWR0aCx0aGlzLnByb3BzLmhlaWdodD10aGlzLmJvZHkuZG9tUHJvcHMubGVmdC5oZWlnaHQpOihuLnN0eWxlLnRvcD0iIixuLnN0eWxlLmJvdHRvbT0iMCIsbi5zdHlsZS5sZWZ0PSIwIixuLnN0eWxlLndpZHRoPXRoaXMud2lkdGgrInB4IixuLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCsicHgiLHRoaXMucHJvcHMud2lkdGg9dGhpcy5ib2R5LmRvbVByb3BzLnJpZ2h0LndpZHRoLHRoaXMucHJvcHMuaGVpZ2h0PXRoaXMuYm9keS5kb21Qcm9wcy5yaWdodC5oZWlnaHQpLHQ9dGhpcy5fcmVkcmF3TGFiZWxzKCksdD10aGlzLl9pc1Jlc2l6ZWQoKXx8dCwhMD09PXRoaXMub3B0aW9ucy5pY29ucz90aGlzLl9yZWRyYXdHcm91cEljb25zKCk6dGhpcy5fY2xlYW51cEljb25zKCksdGhpcy5fcmVkcmF3VGl0bGUocyl9cmV0dXJuIHR9LG8ucHJvdG90eXBlLl9yZWRyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9ITE7YS5wcmVwYXJlRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5saW5lcyksYS5wcmVwYXJlRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5sYWJlbHMpO3ZhciBpPXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbixvPXZvaWQgMCE9dGhpcy5vcHRpb25zW2ldLnJhbmdlP3RoaXMub3B0aW9uc1tpXS5yYW5nZTp7fSxuPSEwO3ZvaWQgMCE9by5tYXgmJih0aGlzLnJhbmdlLmVuZD1vLm1heCxuPSExKTt2YXIgcz0hMDt2b2lkIDAhPW8ubWluJiYodGhpcy5yYW5nZS5zdGFydD1vLm1pbixzPSExKSx0aGlzLnNjYWxlPW5ldyBkKHRoaXMucmFuZ2Uuc3RhcnQsdGhpcy5yYW5nZS5lbmQscyxuLHRoaXMuZG9tLmZyYW1lLm9mZnNldEhlaWdodCx0aGlzLnByb3BzLm1ham9yQ2hhckhlaWdodCx0aGlzLm9wdGlvbnMuYWxpZ25aZXJvcyx0aGlzLm9wdGlvbnNbaV0uZm9ybWF0KSwhMT09PXRoaXMubWFzdGVyJiZ2b2lkIDAhPXRoaXMubWFzdGVyQXhpcyYmdGhpcy5zY2FsZS5mb2xsb3dTY2FsZSh0aGlzLm1hc3RlckF4aXMuc2NhbGUpLHRoaXMubWF4TGFiZWxTaXplPTAsdGhpcy5zY2FsZS5nZXRMaW5lcygpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIG89ZS55LG49ZS5tYWpvcjt0Lm9wdGlvbnMuc2hvd01pbm9yTGFiZWxzJiYhMT09PW4mJnQuX3JlZHJhd0xhYmVsKG8tMixlLnZhbCxpLCJ2aXMteS1heGlzIHZpcy1taW5vciIsdC5wcm9wcy5taW5vckNoYXJIZWlnaHQpLG4mJm8+PTAmJnQuX3JlZHJhd0xhYmVsKG8tMixlLnZhbCxpLCJ2aXMteS1heGlzIHZpcy1tYWpvciIsdC5wcm9wcy5tYWpvckNoYXJIZWlnaHQpLCEwPT09dC5tYXN0ZXImJihuP3QuX3JlZHJhd0xpbmUobyxpLCJ2aXMtZ3JpZCB2aXMtaG9yaXpvbnRhbCB2aXMtbWFqb3IiLHQub3B0aW9ucy5tYWpvckxpbmVzT2Zmc2V0LHQucHJvcHMubWFqb3JMaW5lV2lkdGgpOnQuX3JlZHJhd0xpbmUobyxpLCJ2aXMtZ3JpZCB2aXMtaG9yaXpvbnRhbCB2aXMtbWlub3IiLHQub3B0aW9ucy5taW5vckxpbmVzT2Zmc2V0LHQucHJvcHMubWlub3JMaW5lV2lkdGgpKX0pO3ZhciByPTA7dm9pZCAwIT09dGhpcy5vcHRpb25zW2ldLnRpdGxlJiZ2b2lkIDAhPT10aGlzLm9wdGlvbnNbaV0udGl0bGUudGV4dCYmKHI9dGhpcy5wcm9wcy50aXRsZUNoYXJIZWlnaHQpO3ZhciBoPSEwPT09dGhpcy5vcHRpb25zLmljb25zP01hdGgubWF4KHRoaXMub3B0aW9ucy5pY29uV2lkdGgscikrdGhpcy5vcHRpb25zLmxhYmVsT2Zmc2V0WCsxNTpyK3RoaXMub3B0aW9ucy5sYWJlbE9mZnNldFgrMTU7cmV0dXJuIHRoaXMubWF4TGFiZWxTaXplPnRoaXMud2lkdGgtaCYmITA9PT10aGlzLm9wdGlvbnMudmlzaWJsZT8odGhpcy53aWR0aD10aGlzLm1heExhYmVsU2l6ZStoLHRoaXMub3B0aW9ucy53aWR0aD10aGlzLndpZHRoKyJweCIsYS5jbGVhbnVwRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5saW5lcyksYS5jbGVhbnVwRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5sYWJlbHMpLHRoaXMucmVkcmF3KCksZT0hMCk6dGhpcy5tYXhMYWJlbFNpemU8dGhpcy53aWR0aC1oJiYhMD09PXRoaXMub3B0aW9ucy52aXNpYmxlJiZ0aGlzLndpZHRoPnRoaXMubWluV2lkdGg/KHRoaXMud2lkdGg9TWF0aC5tYXgodGhpcy5taW5XaWR0aCx0aGlzLm1heExhYmVsU2l6ZStoKSx0aGlzLm9wdGlvbnMud2lkdGg9dGhpcy53aWR0aCsicHgiLGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGluZXMpLGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGFiZWxzKSx0aGlzLnJlZHJhdygpLGU9ITApOihhLmNsZWFudXBFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLmxpbmVzKSxhLmNsZWFudXBFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLmxhYmVscyksZT0hMSksZX0sby5wcm90b3R5cGUuY29udmVydFZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjYWxlLmNvbnZlcnRWYWx1ZSh0KX0sby5wcm90b3R5cGUuc2NyZWVuVG9WYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zY2FsZS5zY3JlZW5Ub1ZhbHVlKHQpfSxvLnByb3RvdHlwZS5fcmVkcmF3TGFiZWw9ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcz1hLmdldERPTUVsZW1lbnQoImRpdiIsdGhpcy5ET01lbGVtZW50cy5sYWJlbHMsdGhpcy5kb20uZnJhbWUpO3MuY2xhc3NOYW1lPW8scy5pbm5lckhUTUw9ZSwibGVmdCI9PT1pPyhzLnN0eWxlLmxlZnQ9Ii0iK3RoaXMub3B0aW9ucy5sYWJlbE9mZnNldFgrInB4IixzLnN0eWxlLnRleHRBbGlnbj0icmlnaHQiKToocy5zdHlsZS5yaWdodD0iLSIrdGhpcy5vcHRpb25zLmxhYmVsT2Zmc2V0WCsicHgiLHMuc3R5bGUudGV4dEFsaWduPSJsZWZ0Iikscy5zdHlsZS50b3A9dC0uNSpuK3RoaXMub3B0aW9ucy5sYWJlbE9mZnNldFkrInB4IixlKz0iIjt2YXIgcj1NYXRoLm1heCh0aGlzLnByb3BzLm1ham9yQ2hhcldpZHRoLHRoaXMucHJvcHMubWlub3JDaGFyV2lkdGgpO3RoaXMubWF4TGFiZWxTaXplPGUubGVuZ3RoKnImJih0aGlzLm1heExhYmVsU2l6ZT1lLmxlbmd0aCpyKX0sby5wcm90b3R5cGUuX3JlZHJhd0xpbmU9ZnVuY3Rpb24odCxlLGksbyxuKXtpZighMD09PXRoaXMubWFzdGVyKXt2YXIgcz1hLmdldERPTUVsZW1lbnQoImRpdiIsdGhpcy5ET01lbGVtZW50cy5saW5lcyx0aGlzLmRvbS5saW5lQ29udGFpbmVyKTtzLmNsYXNzTmFtZT1pLHMuaW5uZXJIVE1MPSIiLCJsZWZ0Ij09PWU/cy5zdHlsZS5sZWZ0PXRoaXMud2lkdGgtbysicHgiOnMuc3R5bGUucmlnaHQ9dGhpcy53aWR0aC1vKyJweCIscy5zdHlsZS53aWR0aD1uKyJweCIscy5zdHlsZS50b3A9dCsicHgifX0sby5wcm90b3R5cGUuX3JlZHJhd1RpdGxlPWZ1bmN0aW9uKHQpe2lmKGEucHJlcGFyZUVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMudGl0bGUpLHZvaWQgMCE9PXRoaXMub3B0aW9uc1t0XS50aXRsZSYmdm9pZCAwIT09dGhpcy5vcHRpb25zW3RdLnRpdGxlLnRleHQpe3ZhciBlPWEuZ2V0RE9NRWxlbWVudCgiZGl2Iix0aGlzLkRPTWVsZW1lbnRzLnRpdGxlLHRoaXMuZG9tLmZyYW1lKTtlLmNsYXNzTmFtZT0idmlzLXktYXhpcyB2aXMtdGl0bGUgdmlzLSIrdCxlLmlubmVySFRNTD10aGlzLm9wdGlvbnNbdF0udGl0bGUudGV4dCx2b2lkIDAhPT10aGlzLm9wdGlvbnNbdF0udGl0bGUuc3R5bGUmJnIuYWRkQ3NzVGV4dChlLHRoaXMub3B0aW9uc1t0XS50aXRsZS5zdHlsZSksImxlZnQiPT09dD9lLnN0eWxlLmxlZnQ9dGhpcy5wcm9wcy50aXRsZUNoYXJIZWlnaHQrInB4IjplLnN0eWxlLnJpZ2h0PXRoaXMucHJvcHMudGl0bGVDaGFySGVpZ2h0KyJweCIsZS5zdHlsZS53aWR0aD10aGlzLmhlaWdodCsicHgifWEuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMudGl0bGUpfSxvLnByb3RvdHlwZS5fY2FsY3VsYXRlQ2hhclNpemU9ZnVuY3Rpb24oKXtpZighKCJtaW5vckNoYXJIZWlnaHQiaW4gdGhpcy5wcm9wcykpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIwIiksZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTmFtZT0idmlzLXktYXhpcyB2aXMtbWlub3IgdmlzLW1lYXN1cmUiLGUuYXBwZW5kQ2hpbGQodCksdGhpcy5kb20uZnJhbWUuYXBwZW5kQ2hpbGQoZSksdGhpcy5wcm9wcy5taW5vckNoYXJIZWlnaHQ9ZS5jbGllbnRIZWlnaHQsdGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aD1lLmNsaWVudFdpZHRoLHRoaXMuZG9tLmZyYW1lLnJlbW92ZUNoaWxkKGUpfWlmKCEoIm1ham9yQ2hhckhlaWdodCJpbiB0aGlzLnByb3BzKSl7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjAiKSxvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uY2xhc3NOYW1lPSJ2aXMteS1heGlzIHZpcy1tYWpvciB2aXMtbWVhc3VyZSIsby5hcHBlbmRDaGlsZChpKSx0aGlzLmRvbS5mcmFtZS5hcHBlbmRDaGlsZChvKSx0aGlzLnByb3BzLm1ham9yQ2hhckhlaWdodD1vLmNsaWVudEhlaWdodCx0aGlzLnByb3BzLm1ham9yQ2hhcldpZHRoPW8uY2xpZW50V2lkdGgsdGhpcy5kb20uZnJhbWUucmVtb3ZlQ2hpbGQobyl9aWYoISgidGl0bGVDaGFySGVpZ2h0ImluIHRoaXMucHJvcHMpKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiMCIpLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cy5jbGFzc05hbWU9InZpcy15LWF4aXMgdmlzLXRpdGxlIHZpcy1tZWFzdXJlIixzLmFwcGVuZENoaWxkKG4pLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHMpLHRoaXMucHJvcHMudGl0bGVDaGFySGVpZ2h0PXMuY2xpZW50SGVpZ2h0LHRoaXMucHJvcHMudGl0bGVDaGFyV2lkdGg9cy5jbGllbnRXaWR0aCx0aGlzLmRvbS5mcmFtZS5yZW1vdmVDaGlsZChzKX19LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCxlLGksbyxuLHMpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+NiYmdm9pZCAwIT09YXJndW1lbnRzWzZdJiZhcmd1bWVudHNbNl0sYT1hcmd1bWVudHMubGVuZ3RoPjcmJnZvaWQgMCE9PWFyZ3VtZW50c1s3XSYmYXJndW1lbnRzWzddO2lmKHRoaXMubWFqb3JTdGVwcz1bMSwyLDUsMTBdLHRoaXMubWlub3JTdGVwcz1bLjI1LC41LDEsMl0sdGhpcy5jdXN0b21MaW5lcz1udWxsLHRoaXMuY29udGFpbmVySGVpZ2h0PW4sdGhpcy5tYWpvckNoYXJIZWlnaHQ9cyx0aGlzLl9zdGFydD10LHRoaXMuX2VuZD1lLHRoaXMuc2NhbGU9MSx0aGlzLm1pbm9yU3RlcElkeD0tMSx0aGlzLm1hZ25pdHVkZWZhY3Rvcj0xLHRoaXMuZGV0ZXJtaW5lU2NhbGUoKSx0aGlzLnplcm9BbGlnbj1yLHRoaXMuYXV0b1NjYWxlU3RhcnQ9aSx0aGlzLmF1dG9TY2FsZUVuZD1vLHRoaXMuZm9ybWF0dGluZ0Z1bmN0aW9uPWEsaXx8byl7dmFyIGg9dGhpcyxkPWZ1bmN0aW9uKHQpe3ZhciBlPXQtdCUoaC5tYWduaXR1ZGVmYWN0b3IqaC5taW5vclN0ZXBzW2gubWlub3JTdGVwSWR4XSk7cmV0dXJuIHQlKGgubWFnbml0dWRlZmFjdG9yKmgubWlub3JTdGVwc1toLm1pbm9yU3RlcElkeF0pPmgubWFnbml0dWRlZmFjdG9yKmgubWlub3JTdGVwc1toLm1pbm9yU3RlcElkeF0qLjU/ZStoLm1hZ25pdHVkZWZhY3RvcipoLm1pbm9yU3RlcHNbaC5taW5vclN0ZXBJZHhdOmV9O2kmJih0aGlzLl9zdGFydC09Mip0aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1pbm9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdLHRoaXMuX3N0YXJ0PWQodGhpcy5fc3RhcnQpKSxvJiYodGhpcy5fZW5kKz10aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1pbm9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdLHRoaXMuX2VuZD1kKHRoaXMuX2VuZCkpLHRoaXMuZGV0ZXJtaW5lU2NhbGUoKX19aS5wcm90b3R5cGUuc2V0Q2hhckhlaWdodD1mdW5jdGlvbih0KXt0aGlzLm1ham9yQ2hhckhlaWdodD10fSxpLnByb3RvdHlwZS5zZXRIZWlnaHQ9ZnVuY3Rpb24odCl7dGhpcy5jb250YWluZXJIZWlnaHQ9dH0saS5wcm90b3R5cGUuZGV0ZXJtaW5lU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9lbmQtdGhpcy5fc3RhcnQ7dGhpcy5zY2FsZT10aGlzLmNvbnRhaW5lckhlaWdodC90O3ZhciBlPXRoaXMubWFqb3JDaGFySGVpZ2h0L3RoaXMuc2NhbGUsaT10PjA/TWF0aC5yb3VuZChNYXRoLmxvZyh0KS9NYXRoLkxOMTApOjA7dGhpcy5taW5vclN0ZXBJZHg9LTEsdGhpcy5tYWduaXR1ZGVmYWN0b3I9TWF0aC5wb3coMTAsaSk7dmFyIG89MDtpPDAmJihvPWkpO2Zvcih2YXIgbj0hMSxzPW87TWF0aC5hYnMocyk8PU1hdGguYWJzKGkpO3MrKyl7dGhpcy5tYWduaXR1ZGVmYWN0b3I9TWF0aC5wb3coMTAscyk7Zm9yKHZhciByPTA7cjx0aGlzLm1pbm9yU3RlcHMubGVuZ3RoO3IrKyl7aWYodGhpcy5tYWduaXR1ZGVmYWN0b3IqdGhpcy5taW5vclN0ZXBzW3JdPj1lKXtuPSEwLHRoaXMubWlub3JTdGVwSWR4PXI7YnJlYWt9fWlmKCEwPT09bilicmVha319LGkucHJvdG90eXBlLmlzX21ham9yPWZ1bmN0aW9uKHQpe3JldHVybiB0JSh0aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1ham9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdKT09MH0saS5wcm90b3R5cGUuZ2V0U3RlcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1pbm9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdfSxpLnByb3RvdHlwZS5nZXRGaXJzdE1ham9yPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tYWduaXR1ZGVmYWN0b3IqdGhpcy5tYWpvclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XTtyZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUodGhpcy5fc3RhcnQrKHQtdGhpcy5fc3RhcnQldCkldCl9LGkucHJvdG90eXBlLmZvcm1hdFZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9QcmVjaXNpb24oNSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZm9ybWF0dGluZ0Z1bmN0aW9uJiYoZT10aGlzLmZvcm1hdHRpbmdGdW5jdGlvbih0KSksIm51bWJlciI9PXR5cGVvZiBlPyIiK2U6InN0cmluZyI9PXR5cGVvZiBlP2U6dC50b1ByZWNpc2lvbig1KX0saS5wcm90b3R5cGUuZ2V0TGluZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT10aGlzLmdldFN0ZXAoKSxpPShlLXRoaXMuX3N0YXJ0JWUpJWUsbz10aGlzLl9zdGFydCtpO3RoaXMuX2VuZC1vPjFlLTU7bys9ZSlvIT10aGlzLl9zdGFydCYmdC5wdXNoKHttYWpvcjp0aGlzLmlzX21ham9yKG8pLHk6dGhpcy5jb252ZXJ0VmFsdWUobyksdmFsOnRoaXMuZm9ybWF0VmFsdWUobyl9KTtyZXR1cm4gdH0saS5wcm90b3R5cGUuZm9sbG93U2NhbGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5taW5vclN0ZXBJZHgsaT10aGlzLl9zdGFydCxvPXRoaXMuX2VuZCxuPXRoaXMscz1mdW5jdGlvbigpe24ubWFnbml0dWRlZmFjdG9yKj0yfSxyPWZ1bmN0aW9uKCl7bi5tYWduaXR1ZGVmYWN0b3IvPTJ9O3QubWlub3JTdGVwSWR4PD0xJiZ0aGlzLm1pbm9yU3RlcElkeDw9MXx8dC5taW5vclN0ZXBJZHg+MSYmdGhpcy5taW5vclN0ZXBJZHg+MXx8KHQubWlub3JTdGVwSWR4PHRoaXMubWlub3JTdGVwSWR4Pyh0aGlzLm1pbm9yU3RlcElkeD0xLDI9PWU/cygpOihzKCkscygpKSk6KHRoaXMubWlub3JTdGVwSWR4PTIsMT09ZT9yKCk6KHIoKSxyKCkpKSk7Zm9yKHZhciBhPSh0LmdldExpbmVzKCksdC5jb252ZXJ0VmFsdWUoMCkpLGg9dC5nZXRTdGVwKCkqdC5zY2FsZSxkPSExLGw9MDshZCYmbCsrPDU7KXt0aGlzLnNjYWxlPWgvKHRoaXMubWlub3JTdGVwc1t0aGlzLm1pbm9yU3RlcElkeF0qdGhpcy5tYWduaXR1ZGVmYWN0b3IpO3ZhciB1PXRoaXMuY29udGFpbmVySGVpZ2h0L3RoaXMuc2NhbGU7dGhpcy5fc3RhcnQ9aSx0aGlzLl9lbmQ9dGhpcy5fc3RhcnQrdTt2YXIgYz10aGlzLl9lbmQqdGhpcy5zY2FsZSxwPXRoaXMubWFnbml0dWRlZmFjdG9yKnRoaXMubWFqb3JTdGVwc1t0aGlzLm1pbm9yU3RlcElkeF0sZj10aGlzLmdldEZpcnN0TWFqb3IoKS10LmdldEZpcnN0TWFqb3IoKTtpZih0aGlzLnplcm9BbGlnbil7dmFyIG09YS1jO3RoaXMuX2VuZCs9bS90aGlzLnNjYWxlLHRoaXMuX3N0YXJ0PXRoaXMuX2VuZC11fWVsc2UgdGhpcy5hdXRvU2NhbGVTdGFydD8odGhpcy5fc3RhcnQtPWYvdGhpcy5zY2FsZSx0aGlzLl9lbmQ9dGhpcy5fc3RhcnQrdSk6KHRoaXMuX3N0YXJ0Kz1wLWYvdGhpcy5zY2FsZSx0aGlzLl9lbmQ9dGhpcy5fc3RhcnQrdSk7aWYoIXRoaXMuYXV0b1NjYWxlRW5kJiZ0aGlzLl9lbmQ+bysxZS01KXIoKSxkPSExO2Vsc2V7aWYoIXRoaXMuYXV0b1NjYWxlU3RhcnQmJnRoaXMuX3N0YXJ0PGktMWUtNSl7aWYoISh0aGlzLnplcm9BbGlnbiYmaT49MCkpe3IoKSxkPSExO2NvbnRpbnVlfWNvbnNvbGUud2FybigiQ2FuJ3QgYWRoZXJlIHRvIGdpdmVuICdtaW4nIHJhbmdlLCBkdWUgdG8gemVyb2FsaWduIil9dGhpcy5hdXRvU2NhbGVTdGFydCYmdGhpcy5hdXRvU2NhbGVFbmQmJnU8by1pPyhzKCksZD0hMSk6ZD0hMH19fSxpLnByb3RvdHlwZS5jb252ZXJ0VmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29udGFpbmVySGVpZ2h0LSh0LXRoaXMuX3N0YXJ0KSp0aGlzLnNjYWxlfSxpLnByb3RvdHlwZS5zY3JlZW5Ub1ZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLmNvbnRhaW5lckhlaWdodC10KS90aGlzLnNjYWxlK3RoaXMuX3N0YXJ0fSx0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGksbyl7dGhpcy5pZD1lO3ZhciBuPVsic2FtcGxpbmciLCJzdHlsZSIsInNvcnQiLCJ5QXhpc09yaWVudGF0aW9uIiwiYmFyQ2hhcnQiLCJkcmF3UG9pbnRzIiwic2hhZGVkIiwiaW50ZXJwb2xhdGlvbiIsInpJbmRleCIsImV4Y2x1ZGVGcm9tU3RhY2tpbmciLCJleGNsdWRlRnJvbUxlZ2VuZCJdO3RoaXMub3B0aW9ucz1yLnNlbGVjdGl2ZUJyaWRnZU9iamVjdChuLGkpLHRoaXMudXNpbmdEZWZhdWx0U3R5bGU9dm9pZCAwPT09dC5jbGFzc05hbWUsdGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXM9byx0aGlzLnplcm9Qb3NpdGlvbj0wLHRoaXMudXBkYXRlKHQpLDE9PXRoaXMudXNpbmdEZWZhdWx0U3R5bGUmJih0aGlzLmdyb3Vwc1VzaW5nRGVmYXVsdFN0eWxlc1swXSs9MSksdGhpcy5pdGVtc0RhdGE9W10sdGhpcy52aXNpYmxlPXZvaWQgMD09PXQudmlzaWJsZXx8dC52aXNpYmxlfXZhciBuPWkoNjIpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMSksYT0oaSg4OCksaSgxNTMpKSxoPWkoMTU1KSxkPWkoMTU0KTtvLnByb3RvdHlwZS5zZXRJdGVtcz1mdW5jdGlvbih0KXtudWxsIT10Pyh0aGlzLml0ZW1zRGF0YT10LDE9PXRoaXMub3B0aW9ucy5zb3J0JiZyLmluc2VydFNvcnQodGhpcy5pdGVtc0RhdGEsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC54PmUueD8xOi0xfSkpOnRoaXMuaXRlbXNEYXRhPVtdfSxvLnByb3RvdHlwZS5nZXRJdGVtcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZW1zRGF0YX0sby5wcm90b3R5cGUuc2V0WmVyb1Bvc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuemVyb1Bvc2l0aW9uPXR9LG8ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dmFyIGU9WyJzYW1wbGluZyIsInN0eWxlIiwic29ydCIsInlBeGlzT3JpZW50YXRpb24iLCJiYXJDaGFydCIsInpJbmRleCIsImV4Y2x1ZGVGcm9tU3RhY2tpbmciLCJleGNsdWRlRnJvbUxlZ2VuZCJdO3Iuc2VsZWN0aXZlRGVlcEV4dGVuZChlLHRoaXMub3B0aW9ucyx0KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5kcmF3UG9pbnRzJiYodC5kcmF3UG9pbnRzPXtvblJlbmRlcjp0LmRyYXdQb2ludHN9KSxyLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCwiaW50ZXJwb2xhdGlvbiIpLHIubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LCJkcmF3UG9pbnRzIiksci5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsInNoYWRlZCIpLHQuaW50ZXJwb2xhdGlvbiYmIm9iamVjdCI9PSgwLHMuZGVmYXVsdCkodC5pbnRlcnBvbGF0aW9uKSYmdC5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbiYmKCJ1bmlmb3JtIj09dC5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbj90aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYT0wOiJjaG9yZGFsIj09dC5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbj90aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYT0xOih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5wYXJhbWV0cml6YXRpb249ImNlbnRyaXBldGFsIix0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYT0uNSkpfX0sby5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXA9dCx0aGlzLmNvbnRlbnQ9dC5jb250ZW50fHwiZ3JhcGgiLHRoaXMuY2xhc3NOYW1lPXQuY2xhc3NOYW1lfHx0aGlzLmNsYXNzTmFtZXx8InZpcy1ncmFwaC1ncm91cCIrdGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXNbMF0lMTAsdGhpcy52aXNpYmxlPXZvaWQgMD09PXQudmlzaWJsZXx8dC52aXNpYmxlLHRoaXMuc3R5bGU9dC5zdHlsZSx0aGlzLnNldE9wdGlvbnModC5vcHRpb25zKX0sby5wcm90b3R5cGUuZ2V0TGVnZW5kPWZ1bmN0aW9uKHQsZSxpLG8sbil7aWYodm9pZCAwPT1pfHxudWxsPT1pKXtpPXtzdmc6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsInN2ZyIpLHN2Z0VsZW1lbnRzOnt9LG9wdGlvbnM6dGhpcy5vcHRpb25zLGdyb3VwczpbdGhpc119fXN3aXRjaCh2b2lkIDAhPW8mJm51bGwhPW98fChvPTApLHZvaWQgMCE9biYmbnVsbCE9bnx8KG49LjUqZSksdGhpcy5vcHRpb25zLnN0eWxlKXtjYXNlImxpbmUiOmguZHJhd0ljb24odGhpcyxvLG4sdCxlLGkpO2JyZWFrO2Nhc2UicG9pbnRzIjpjYXNlInBvaW50IjpkLmRyYXdJY29uKHRoaXMsbyxuLHQsZSxpKTticmVhaztjYXNlImJhciI6YS5kcmF3SWNvbih0aGlzLG8sbix0LGUsaSl9cmV0dXJue2ljb246aS5zdmcsbGFiZWw6dGhpcy5jb250ZW50LG9yaWVudGF0aW9uOnRoaXMub3B0aW9ucy55QXhpc09yaWVudGF0aW9ufX0sby5wcm90b3R5cGUuZ2V0WVJhbmdlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10WzBdLnksaT10WzBdLnksbz0wO288dC5sZW5ndGg7bysrKWU9ZT50W29dLnk/dFtvXS55OmUsaT1pPHRbb10ueT90W29dLnk6aTtyZXR1cm57bWluOmUsbWF4OmkseUF4aXNPcmllbnRhdGlvbjp0aGlzLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbn19LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe312YXIgbj1pKDg4KSxzPWkoMTU0KTtvLmRyYXdJY29uPWZ1bmN0aW9uKHQsZSxpLG8scyxyKXt2YXIgYT0uNSpzLGg9bi5nZXRTVkdFbGVtZW50KCJyZWN0IixyLnN2Z0VsZW1lbnRzLHIuc3ZnKTtoLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLGUpLGguc2V0QXR0cmlidXRlTlMobnVsbCwieSIsaS1hKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIixvKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsMiphKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsImNsYXNzIiwidmlzLW91dGxpbmUiKTt2YXIgZD1NYXRoLnJvdW5kKC4zKm8pLGw9dC5vcHRpb25zLmJhckNoYXJ0LndpZHRoLHU9bC9kLGM9TWF0aC5yb3VuZCguNCpzKSxwPU1hdGgucm91bmQoLjc1KnMpLGY9TWF0aC5yb3VuZCgoby0yKmQpLzMpO2lmKG4uZHJhd0JhcihlKy41KmQrZixpK2EtYy0xLGQsYyx0LmNsYXNzTmFtZSsiIHZpcy1iYXIiLHIuc3ZnRWxlbWVudHMsci5zdmcsdC5zdHlsZSksbi5kcmF3QmFyKGUrMS41KmQrZisyLGkrYS1wLTEsZCxwLHQuY2xhc3NOYW1lKyIgdmlzLWJhciIsci5zdmdFbGVtZW50cyxyLnN2Zyx0LnN0eWxlKSwxPT10Lm9wdGlvbnMuZHJhd1BvaW50cy5lbmFibGVkKXt2YXIgbT17c3R5bGU6dC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGUsc3R5bGVzOnQub3B0aW9ucy5kcmF3UG9pbnRzLnN0eWxlcyxzaXplOnQub3B0aW9ucy5kcmF3UG9pbnRzLnNpemUvdSxjbGFzc05hbWU6dC5jbGFzc05hbWV9O24uZHJhd1BvaW50KGUrLjUqZCtmLGkrYS1jLTEsbSxyLnN2Z0VsZW1lbnRzLHIuc3ZnKSxuLmRyYXdQb2ludChlKzEuNSpkK2YrMixpK2EtcC0xLG0sci5zdmdFbGVtZW50cyxyLnN2Zyl9fSxvLmRyYXc9ZnVuY3Rpb24odCxlLGkpe3ZhciByLGEsaCxkLGwsdSxjPVtdLHA9e30sZj0wO2ZvcihsPTA7bDx0Lmxlbmd0aDtsKyspaWYoZD1pLmdyb3Vwc1t0W2xdXSwiYmFyIj09PWQub3B0aW9ucy5zdHlsZSYmITA9PT1kLnZpc2libGUmJih2b2lkIDA9PT1pLm9wdGlvbnMuZ3JvdXBzLnZpc2liaWxpdHlbdFtsXV18fCEwPT09aS5vcHRpb25zLmdyb3Vwcy52aXNpYmlsaXR5W3RbbF1dKSlmb3IodT0wO3U8ZVt0W2xdXS5sZW5ndGg7dSsrKWMucHVzaCh7c2NyZWVuX3g6ZVt0W2xdXVt1XS5zY3JlZW5feCxzY3JlZW5fZW5kOmVbdFtsXV1bdV0uc2NyZWVuX2VuZCxzY3JlZW5feTplW3RbbF1dW3VdLnNjcmVlbl95LHg6ZVt0W2xdXVt1XS54LGVuZDplW3RbbF1dW3VdLmVuZCx5OmVbdFtsXV1bdV0ueSxncm91cElkOnRbbF0sbGFiZWw6ZVt0W2xdXVt1XS5sYWJlbH0pLGYrPTE7aWYoMCE9PWYpZm9yKGMuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LnNjcmVlbl94PT09ZS5zY3JlZW5feD90Lmdyb3VwSWQ8ZS5ncm91cElkPy0xOjE6dC5zY3JlZW5feC1lLnNjcmVlbl94fSksby5fZ2V0RGF0YUludGVyc2VjdGlvbnMocCxjKSxsPTA7bDxjLmxlbmd0aDtsKyspe2Q9aS5ncm91cHNbY1tsXS5ncm91cElkXTt2YXIgbT12b2lkIDAhPWQub3B0aW9ucy5iYXJDaGFydC5taW5XaWR0aD9kLm9wdGlvbnMuYmFyQ2hhcnQubWluV2lkdGg6LjEqZC5vcHRpb25zLmJhckNoYXJ0LndpZHRoO2E9Y1tsXS5zY3JlZW5feDt2YXIgdj0wO2lmKHZvaWQgMD09PXBbYV0pbCsxPGMubGVuZ3RoJiYocj1NYXRoLmFicyhjW2wrMV0uc2NyZWVuX3gtYSkpLGg9by5fZ2V0U2FmZURyYXdEYXRhKHIsZCxtKTtlbHNle3ZhciBnPWwrKHBbYV0uYW1vdW50LXBbYV0ucmVzb2x2ZWQpO3BbYV0ucmVzb2x2ZWQ7ZzxjLmxlbmd0aCYmKHI9TWF0aC5hYnMoY1tnXS5zY3JlZW5feC1hKSksaD1vLl9nZXRTYWZlRHJhd0RhdGEocixkLG0pLHBbYV0ucmVzb2x2ZWQrPTEsITA9PT1kLm9wdGlvbnMuc3RhY2smJiEwIT09ZC5vcHRpb25zLmV4Y2x1ZGVGcm9tU3RhY2tpbmc/Y1tsXS5zY3JlZW5feTxkLnplcm9Qb3NpdGlvbj8odj1wW2FdLmFjY3VtdWxhdGVkTmVnYXRpdmUscFthXS5hY2N1bXVsYXRlZE5lZ2F0aXZlKz1kLnplcm9Qb3NpdGlvbi1jW2xdLnNjcmVlbl95KToodj1wW2FdLmFjY3VtdWxhdGVkUG9zaXRpdmUscFthXS5hY2N1bXVsYXRlZFBvc2l0aXZlKz1kLnplcm9Qb3NpdGlvbi1jW2xdLnNjcmVlbl95KTohMD09PWQub3B0aW9ucy5iYXJDaGFydC5zaWRlQnlTaWRlJiYoaC53aWR0aD1oLndpZHRoL3BbYV0uYW1vdW50LGgub2Zmc2V0Kz1wW2FdLnJlc29sdmVkKmgud2lkdGgtLjUqaC53aWR0aCoocFthXS5hbW91bnQrMSkpfXZhciB5PWgud2lkdGgsYj1jW2xdLnNjcmVlbl94O2lmKHZvaWQgMCE9Y1tsXS5zY3JlZW5fZW5kPyh5PWNbbF0uc2NyZWVuX2VuZC1jW2xdLnNjcmVlbl94LGIrPS41KnkpOmIrPWgub2Zmc2V0LG4uZHJhd0JhcihiLGNbbF0uc2NyZWVuX3ktdix5LGQuemVyb1Bvc2l0aW9uLWNbbF0uc2NyZWVuX3ksZC5jbGFzc05hbWUrIiB2aXMtYmFyIixpLnN2Z0VsZW1lbnRzLGkuc3ZnLGQuc3R5bGUpLCEwPT09ZC5vcHRpb25zLmRyYXdQb2ludHMuZW5hYmxlZCl7dmFyIF89e3NjcmVlbl94OmNbbF0uc2NyZWVuX3gsc2NyZWVuX3k6Y1tsXS5zY3JlZW5feS12LHg6Y1tsXS54LHk6Y1tsXS55LGdyb3VwSWQ6Y1tsXS5ncm91cElkLGxhYmVsOmNbbF0ubGFiZWx9O3MuZHJhdyhbX10sZCxpLGgub2Zmc2V0KX19fSxvLl9nZXREYXRhSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaSxvPTA7bzxlLmxlbmd0aDtvKyspbysxPGUubGVuZ3RoJiYoaT1NYXRoLmFicyhlW28rMV0uc2NyZWVuX3gtZVtvXS5zY3JlZW5feCkpLG8+MCYmKGk9TWF0aC5taW4oaSxNYXRoLmFicyhlW28tMV0uc2NyZWVuX3gtZVtvXS5zY3JlZW5feCkpKSwwPT09aSYmKHZvaWQgMD09PXRbZVtvXS5zY3JlZW5feF0mJih0W2Vbb10uc2NyZWVuX3hdPXthbW91bnQ6MCxyZXNvbHZlZDowLGFjY3VtdWxhdGVkUG9zaXRpdmU6MCxhY2N1bXVsYXRlZE5lZ2F0aXZlOjB9KSx0W2Vbb10uc2NyZWVuX3hdLmFtb3VudCs9MSl9LG8uX2dldFNhZmVEcmF3RGF0YT1mdW5jdGlvbih0LGUsaSl7dmFyIG8sbjtyZXR1cm4gdDxlLm9wdGlvbnMuYmFyQ2hhcnQud2lkdGgmJnQ+MD8obz10PGk/aTp0LG49MCwibGVmdCI9PT1lLm9wdGlvbnMuYmFyQ2hhcnQuYWxpZ24/bi09LjUqdDoicmlnaHQiPT09ZS5vcHRpb25zLmJhckNoYXJ0LmFsaWduJiYobis9LjUqdCkpOihvPWUub3B0aW9ucy5iYXJDaGFydC53aWR0aCxuPTAsImxlZnQiPT09ZS5vcHRpb25zLmJhckNoYXJ0LmFsaWduP24tPS41KmUub3B0aW9ucy5iYXJDaGFydC53aWR0aDoicmlnaHQiPT09ZS5vcHRpb25zLmJhckNoYXJ0LmFsaWduJiYobis9LjUqZS5vcHRpb25zLmJhckNoYXJ0LndpZHRoKSkse3dpZHRoOm8sb2Zmc2V0Om59fSxvLmdldFN0YWNrZWRZUmFuZ2U9ZnVuY3Rpb24odCxlLGksbixzKXtpZih0Lmxlbmd0aD4wKXt0LnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zY3JlZW5feD09PWUuc2NyZWVuX3g/dC5ncm91cElkPGUuZ3JvdXBJZD8tMToxOnQuc2NyZWVuX3gtZS5zY3JlZW5feH0pO3ZhciByPXt9O28uX2dldERhdGFJbnRlcnNlY3Rpb25zKHIsdCksZVtuXT1vLl9nZXRTdGFja2VkWVJhbmdlKHIsdCksZVtuXS55QXhpc09yaWVudGF0aW9uPXMsaS5wdXNoKG4pfX0sby5fZ2V0U3RhY2tlZFlSYW5nZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaSxvPWVbMF0uc2NyZWVuX3ksbj1lWzBdLnNjcmVlbl95LHM9MDtzPGUubGVuZ3RoO3MrKylpPWVbc10uc2NyZWVuX3gsdm9pZCAwPT09dFtpXT8obz1vPmVbc10uc2NyZWVuX3k/ZVtzXS5zY3JlZW5feTpvLG49bjxlW3NdLnNjcmVlbl95P2Vbc10uc2NyZWVuX3k6bik6ZVtzXS5zY3JlZW5feTwwP3RbaV0uYWNjdW11bGF0ZWROZWdhdGl2ZSs9ZVtzXS5zY3JlZW5feTp0W2ldLmFjY3VtdWxhdGVkUG9zaXRpdmUrPWVbc10uc2NyZWVuX3k7Zm9yKHZhciByIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShyKSYmKG89bz50W3JdLmFjY3VtdWxhdGVkTmVnYXRpdmU/dFtyXS5hY2N1bXVsYXRlZE5lZ2F0aXZlOm8sbz1vPnRbcl0uYWNjdW11bGF0ZWRQb3NpdGl2ZT90W3JdLmFjY3VtdWxhdGVkUG9zaXRpdmU6byxuPW48dFtyXS5hY2N1bXVsYXRlZE5lZ2F0aXZlP3Rbcl0uYWNjdW11bGF0ZWROZWdhdGl2ZTpuLG49bjx0W3JdLmFjY3VtdWxhdGVkUG9zaXRpdmU/dFtyXS5hY2N1bXVsYXRlZFBvc2l0aXZlOm4pO3JldHVybnttaW46byxtYXg6bn19LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe31mdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGU9dm9pZCAwPT09ZT97fTplLHtzdHlsZTplLnN0eWxlfHx0Lm9wdGlvbnMuZHJhd1BvaW50cy5zdHlsZSxzdHlsZXM6ZS5zdHlsZXN8fHQub3B0aW9ucy5kcmF3UG9pbnRzLnN0eWxlcyxzaXplOmUuc2l6ZXx8dC5vcHRpb25zLmRyYXdQb2ludHMuc2l6ZSxjbGFzc05hbWU6ZS5jbGFzc05hbWV8fHQuY2xhc3NOYW1lfX1mdW5jdGlvbiBzKHQsZSl7dmFyIGk9dm9pZCAwO3JldHVybiB0Lm9wdGlvbnMmJnQub3B0aW9ucy5kcmF3UG9pbnRzJiZ0Lm9wdGlvbnMuZHJhd1BvaW50cy5vblJlbmRlciYmImZ1bmN0aW9uIj09dHlwZW9mIHQub3B0aW9ucy5kcmF3UG9pbnRzLm9uUmVuZGVyJiYoaT10Lm9wdGlvbnMuZHJhd1BvaW50cy5vblJlbmRlciksZS5ncm91cC5vcHRpb25zJiZlLmdyb3VwLm9wdGlvbnMuZHJhd1BvaW50cyYmZS5ncm91cC5vcHRpb25zLmRyYXdQb2ludHMub25SZW5kZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdyb3VwLm9wdGlvbnMuZHJhd1BvaW50cy5vblJlbmRlciYmKGk9ZS5ncm91cC5vcHRpb25zLmRyYXdQb2ludHMub25SZW5kZXIpLGl9dmFyIHI9aSg2MiksYT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KHIpLGg9aSg4OCk7by5kcmF3PWZ1bmN0aW9uKHQsZSxpLG8pe289b3x8MDtmb3IodmFyIHI9cyhpLGUpLGQ9MDtkPHQubGVuZ3RoO2QrKylpZihyKXt2YXIgbD1yKHRbZF0sZSk7ITAhPT1sJiYib2JqZWN0IiE9PSh2b2lkIDA9PT1sPyJ1bmRlZmluZWQiOigwLGEuZGVmYXVsdCkobCkpfHxoLmRyYXdQb2ludCh0W2RdLnNjcmVlbl94K28sdFtkXS5zY3JlZW5feSxuKGUsbCksaS5zdmdFbGVtZW50cyxpLnN2Zyx0W2RdLmxhYmVsKX1lbHNlIGguZHJhd1BvaW50KHRbZF0uc2NyZWVuX3grbyx0W2RdLnNjcmVlbl95LG4oZSksaS5zdmdFbGVtZW50cyxpLnN2Zyx0W2RdLmxhYmVsKX0sby5kcmF3SWNvbj1mdW5jdGlvbih0LGUsaSxvLHMscil7dmFyIGE9LjUqcyxkPWguZ2V0U1ZHRWxlbWVudCgicmVjdCIsci5zdmdFbGVtZW50cyxyLnN2Zyk7ZC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ4IixlKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLGktYSksZC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ3aWR0aCIsbyksZC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLDIqYSksZC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGFzcyIsInZpcy1vdXRsaW5lIiksaC5kcmF3UG9pbnQoZSsuNSpvLGksbih0KSxyLnN2Z0VsZW1lbnRzLHIuc3ZnKX0sdC5leHBvcnRzPW8KfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe312YXIgbj1pKDg4KTtvLmNhbGNQYXRoPWZ1bmN0aW9uKHQsZSl7aWYobnVsbCE9dCYmdC5sZW5ndGg+MCl7cmV0dXJuIDE9PWUub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmVuYWJsZWQ/by5fY2F0bXVsbFJvbSh0LGUpOm8uX2xpbmVhcih0KX19LG8uZHJhd0ljb249ZnVuY3Rpb24odCxlLGksbyxzLHIpe3ZhciBhLGgsZD0uNSpzLGw9bi5nZXRTVkdFbGVtZW50KCJyZWN0IixyLnN2Z0VsZW1lbnRzLHIuc3ZnKTtpZihsLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLGUpLGwuc2V0QXR0cmlidXRlTlMobnVsbCwieSIsaS1kKSxsLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIixvKSxsLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsMipkKSxsLnNldEF0dHJpYnV0ZU5TKG51bGwsImNsYXNzIiwidmlzLW91dGxpbmUiKSxhPW4uZ2V0U1ZHRWxlbWVudCgicGF0aCIsci5zdmdFbGVtZW50cyxyLnN2ZyksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGFzcyIsdC5jbGFzc05hbWUpLHZvaWQgMCE9PXQuc3R5bGUmJmEuc2V0QXR0cmlidXRlTlMobnVsbCwic3R5bGUiLHQuc3R5bGUpLGEuc2V0QXR0cmlidXRlTlMobnVsbCwiZCIsIk0iK2UrIiwiK2krIiBMIisoZStvKSsiLCIraSksMT09dC5vcHRpb25zLnNoYWRlZC5lbmFibGVkJiYoaD1uLmdldFNWR0VsZW1lbnQoInBhdGgiLHIuc3ZnRWxlbWVudHMsci5zdmcpLCJ0b3AiPT10Lm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uP2guc2V0QXR0cmlidXRlTlMobnVsbCwiZCIsIk0iK2UrIiwgIisoaS1kKSsiTCIrZSsiLCIraSsiIEwiKyhlK28pKyIsIitpKyIgTCIrKGUrbykrIiwiKyhpLWQpKTpoLnNldEF0dHJpYnV0ZU5TKG51bGwsImQiLCJNIitlKyIsIitpKyIgTCIrZSsiLCIrKGkrZCkrIiBMIisoZStvKSsiLCIrKGkrZCkrIkwiKyhlK28pKyIsIitpKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsImNsYXNzIix0LmNsYXNzTmFtZSsiIHZpcy1pY29uLWZpbGwiKSx2b2lkIDAhPT10Lm9wdGlvbnMuc2hhZGVkLnN0eWxlJiYiIiE9PXQub3B0aW9ucy5zaGFkZWQuc3R5bGUmJmguc2V0QXR0cmlidXRlTlMobnVsbCwic3R5bGUiLHQub3B0aW9ucy5zaGFkZWQuc3R5bGUpKSwxPT10Lm9wdGlvbnMuZHJhd1BvaW50cy5lbmFibGVkKXt2YXIgdT17c3R5bGU6dC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGUsc3R5bGVzOnQub3B0aW9ucy5kcmF3UG9pbnRzLnN0eWxlcyxzaXplOnQub3B0aW9ucy5kcmF3UG9pbnRzLnNpemUsY2xhc3NOYW1lOnQuY2xhc3NOYW1lfTtuLmRyYXdQb2ludChlKy41Km8saSx1LHIuc3ZnRWxlbWVudHMsci5zdmcpfX0sby5kcmF3U2hhZGluZz1mdW5jdGlvbih0LGUsaSxvKXtpZigxPT1lLm9wdGlvbnMuc2hhZGVkLmVuYWJsZWQpe3ZhciBzPU51bWJlcihvLnN2Zy5zdHlsZS5oZWlnaHQucmVwbGFjZSgicHgiLCIiKSkscj1uLmdldFNWR0VsZW1lbnQoInBhdGgiLG8uc3ZnRWxlbWVudHMsby5zdmcpLGE9IkwiOzE9PWUub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmVuYWJsZWQmJihhPSJDIik7dmFyIGgsZD0wO2Q9InRvcCI9PWUub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24/MDoiYm90dG9tIj09ZS5vcHRpb25zLnNoYWRlZC5vcmllbnRhdGlvbj9zOk1hdGgubWluKE1hdGgubWF4KDAsZS56ZXJvUG9zaXRpb24pLHMpLGg9Imdyb3VwIj09ZS5vcHRpb25zLnNoYWRlZC5vcmllbnRhdGlvbiYmbnVsbCE9aSYmdm9pZCAwIT1pPyJNIit0WzBdWzBdKyIsIit0WzBdWzFdKyIgIit0aGlzLnNlcmlhbGl6ZVBhdGgodCxhLCExKSsiIEwiK2lbaS5sZW5ndGgtMV1bMF0rIiwiK2lbaS5sZW5ndGgtMV1bMV0rIiAiK3RoaXMuc2VyaWFsaXplUGF0aChpLGEsITApK2lbMF1bMF0rIiwiK2lbMF1bMV0rIiBaIjoiTSIrdFswXVswXSsiLCIrdFswXVsxXSsiICIrdGhpcy5zZXJpYWxpemVQYXRoKHQsYSwhMSkrIiBWIitkKyIgSCIrdFswXVswXSsiIFoiLHIuc2V0QXR0cmlidXRlTlMobnVsbCwiY2xhc3MiLGUuY2xhc3NOYW1lKyIgdmlzLWZpbGwiKSx2b2lkIDAhPT1lLm9wdGlvbnMuc2hhZGVkLnN0eWxlJiZyLnNldEF0dHJpYnV0ZU5TKG51bGwsInN0eWxlIixlLm9wdGlvbnMuc2hhZGVkLnN0eWxlKSxyLnNldEF0dHJpYnV0ZU5TKG51bGwsImQiLGgpfX0sby5kcmF3PWZ1bmN0aW9uKHQsZSxpKXtpZihudWxsIT10JiZ2b2lkIDAhPXQpe3ZhciBvPW4uZ2V0U1ZHRWxlbWVudCgicGF0aCIsaS5zdmdFbGVtZW50cyxpLnN2Zyk7by5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGFzcyIsZS5jbGFzc05hbWUpLHZvaWQgMCE9PWUuc3R5bGUmJm8uc2V0QXR0cmlidXRlTlMobnVsbCwic3R5bGUiLGUuc3R5bGUpO3ZhciBzPSJMIjsxPT1lLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5lbmFibGVkJiYocz0iQyIpLG8uc2V0QXR0cmlidXRlTlMobnVsbCwiZCIsIk0iK3RbMF1bMF0rIiwiK3RbMF1bMV0rIiAiK3RoaXMuc2VyaWFsaXplUGF0aCh0LHMsITEpKX19LG8uc2VyaWFsaXplUGF0aD1mdW5jdGlvbih0LGUsaSl7aWYodC5sZW5ndGg8MilyZXR1cm4iIjt2YXIgbz1lO2lmKGkpZm9yKHZhciBuPXQubGVuZ3RoLTI7bj4wO24tLSlvKz10W25dWzBdKyIsIit0W25dWzFdKyIgIjtlbHNlIGZvcih2YXIgbj0xO248dC5sZW5ndGg7bisrKW8rPXRbbl1bMF0rIiwiK3Rbbl1bMV0rIiAiO3JldHVybiBvfSxvLl9jYXRtdWxsUm9tVW5pZm9ybT1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbixzLHIsYT1bXTthLnB1c2goW01hdGgucm91bmQodFswXS5zY3JlZW5feCksTWF0aC5yb3VuZCh0WzBdLnNjcmVlbl95KV0pO2Zvcih2YXIgaD10Lmxlbmd0aCxkPTA7ZDxoLTE7ZCsrKWU9MD09ZD90WzBdOnRbZC0xXSxpPXRbZF0sbz10W2QrMV0sbj1kKzI8aD90W2QrMl06byxzPXtzY3JlZW5feDooLWUuc2NyZWVuX3grNippLnNjcmVlbl94K28uc2NyZWVuX3gpKigxLzYpLHNjcmVlbl95OigtZS5zY3JlZW5feSs2Kmkuc2NyZWVuX3krby5zY3JlZW5feSkqKDEvNil9LHI9e3NjcmVlbl94OihpLnNjcmVlbl94KzYqby5zY3JlZW5feC1uLnNjcmVlbl94KSooMS82KSxzY3JlZW5feTooaS5zY3JlZW5feSs2Km8uc2NyZWVuX3ktbi5zY3JlZW5feSkqKDEvNil9LGEucHVzaChbcy5zY3JlZW5feCxzLnNjcmVlbl95XSksYS5wdXNoKFtyLnNjcmVlbl94LHIuc2NyZWVuX3ldKSxhLnB1c2goW28uc2NyZWVuX3gsby5zY3JlZW5feV0pO3JldHVybiBhfSxvLl9jYXRtdWxsUm9tPWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5vcHRpb25zLmludGVycG9sYXRpb24uYWxwaGE7aWYoMD09aXx8dm9pZCAwPT09aSlyZXR1cm4gdGhpcy5fY2F0bXVsbFJvbVVuaWZvcm0odCk7dmFyIG8sbixzLHIsYSxoLGQsbCx1LGMscCxmLG0sdixnLHksYixfLHcseD1bXTt4LnB1c2goW01hdGgucm91bmQodFswXS5zY3JlZW5feCksTWF0aC5yb3VuZCh0WzBdLnNjcmVlbl95KV0pO2Zvcih2YXIgaz10Lmxlbmd0aCxNPTA7TTxrLTE7TSsrKW89MD09TT90WzBdOnRbTS0xXSxuPXRbTV0scz10W00rMV0scj1NKzI8az90W00rMl06cyxkPU1hdGguc3FydChNYXRoLnBvdyhvLnNjcmVlbl94LW4uc2NyZWVuX3gsMikrTWF0aC5wb3coby5zY3JlZW5feS1uLnNjcmVlbl95LDIpKSxsPU1hdGguc3FydChNYXRoLnBvdyhuLnNjcmVlbl94LXMuc2NyZWVuX3gsMikrTWF0aC5wb3cobi5zY3JlZW5feS1zLnNjcmVlbl95LDIpKSx1PU1hdGguc3FydChNYXRoLnBvdyhzLnNjcmVlbl94LXIuc2NyZWVuX3gsMikrTWF0aC5wb3cocy5zY3JlZW5feS1yLnNjcmVlbl95LDIpKSx2PU1hdGgucG93KHUsaSkseT1NYXRoLnBvdyh1LDIqaSksZz1NYXRoLnBvdyhsLGkpLGI9TWF0aC5wb3cobCwyKmkpLHc9TWF0aC5wb3coZCxpKSxfPU1hdGgucG93KGQsMippKSxjPTIqXyszKncqZytiLHA9Mip5KzMqdipnK2IsZj0zKncqKHcrZyksZj4wJiYoZj0xL2YpLG09Myp2Kih2K2cpLG0+MCYmKG09MS9tKSxhPXtzY3JlZW5feDooLWIqby5zY3JlZW5feCtjKm4uc2NyZWVuX3grXypzLnNjcmVlbl94KSpmLHNjcmVlbl95OigtYipvLnNjcmVlbl95K2Mqbi5zY3JlZW5feStfKnMuc2NyZWVuX3kpKmZ9LGg9e3NjcmVlbl94Oih5Km4uc2NyZWVuX3grcCpzLnNjcmVlbl94LWIqci5zY3JlZW5feCkqbSxzY3JlZW5feTooeSpuLnNjcmVlbl95K3Aqcy5zY3JlZW5feS1iKnIuc2NyZWVuX3kpKm19LDA9PWEuc2NyZWVuX3gmJjA9PWEuc2NyZWVuX3kmJihhPW4pLDA9PWguc2NyZWVuX3gmJjA9PWguc2NyZWVuX3kmJihoPXMpLHgucHVzaChbYS5zY3JlZW5feCxhLnNjcmVlbl95XSkseC5wdXNoKFtoLnNjcmVlbl94LGguc2NyZWVuX3ldKSx4LnB1c2goW3Muc2NyZWVuX3gscy5zY3JlZW5feV0pO3JldHVybiB4fSxvLl9saW5lYXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9MDtpPHQubGVuZ3RoO2krKyllLnB1c2goW3RbaV0uc2NyZWVuX3gsdFtpXS5zY3JlZW5feV0pO3JldHVybiBlfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGksbyl7dGhpcy5ib2R5PXQsdGhpcy5kZWZhdWx0T3B0aW9ucz17ZW5hYmxlZDohMSxpY29uczohMCxpY29uU2l6ZToyMCxpY29uU3BhY2luZzo2LGxlZnQ6e3Zpc2libGU6ITAscG9zaXRpb246InRvcC1sZWZ0In0scmlnaHQ6e3Zpc2libGU6ITAscG9zaXRpb246InRvcC1yaWdodCJ9fSx0aGlzLnNpZGU9aSx0aGlzLm9wdGlvbnM9ci5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5saW5lZ3JhcGhPcHRpb25zPW8sdGhpcy5zdmdFbGVtZW50cz17fSx0aGlzLmRvbT17fSx0aGlzLmdyb3Vwcz17fSx0aGlzLmFtb3VudE9mR3JvdXBzPTAsdGhpcy5fY3JlYXRlKCksdGhpcy5mcmFtZXdvcms9e3N2Zzp0aGlzLnN2ZyxzdmdFbGVtZW50czp0aGlzLnN2Z0VsZW1lbnRzLG9wdGlvbnM6dGhpcy5vcHRpb25zLGdyb3Vwczp0aGlzLmdyb3Vwc30sdGhpcy5zZXRPcHRpb25zKGUpfXZhciBuPWkoNTgpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMSksYT1pKDg4KSxoPWkoMTIwKTtvLnByb3RvdHlwZT1uZXcgaCxvLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuZ3JvdXBzPXt9LHRoaXMuYW1vdW50T2ZHcm91cHM9MH0sby5wcm90b3R5cGUuYWRkR3JvdXA9ZnVuY3Rpb24odCxlKXsxIT1lLm9wdGlvbnMuZXhjbHVkZUZyb21MZWdlbmQmJih0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eSh0KXx8KHRoaXMuZ3JvdXBzW3RdPWUpLHRoaXMuYW1vdW50T2ZHcm91cHMrPTEpfSxvLnByb3RvdHlwZS51cGRhdGVHcm91cD1mdW5jdGlvbih0LGUpe3RoaXMuZ3JvdXBzW3RdPWV9LG8ucHJvdG90eXBlLnJlbW92ZUdyb3VwPWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHQpJiYoZGVsZXRlIHRoaXMuZ3JvdXBzW3RdLHRoaXMuYW1vdW50T2ZHcm91cHMtPTEpfSxvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uZnJhbWUuY2xhc3NOYW1lPSJ2aXMtbGVnZW5kIix0aGlzLmRvbS5mcmFtZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZG9tLmZyYW1lLnN0eWxlLnRvcD0iMTBweCIsdGhpcy5kb20uZnJhbWUuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuZG9tLnRleHRBcmVhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLnRleHRBcmVhLmNsYXNzTmFtZT0idmlzLWxlZ2VuZC10ZXh0Iix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLnRvcD0iMHB4Iix0aGlzLnN2Zz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwic3ZnIiksdGhpcy5zdmcuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnN2Zy5zdHlsZS50b3A9IjBweCIsdGhpcy5zdmcuc3R5bGUud2lkdGg9dGhpcy5vcHRpb25zLmljb25TaXplKzUrInB4Iix0aGlzLnN2Zy5zdHlsZS5oZWlnaHQ9IjEwMCUiLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuc3ZnKSx0aGlzLmRvbS5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmRvbS50ZXh0QXJlYSl9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlJiZ0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmZyYW1lKX0sby5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGV8fHRoaXMuYm9keS5kb20uY2VudGVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLmZyYW1lKX0sby5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXt2YXIgZT1bImVuYWJsZWQiLCJvcmllbnRhdGlvbiIsImljb25zIiwibGVmdCIsInJpZ2h0Il07ci5zZWxlY3RpdmVEZWVwRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt2YXIgdD0wLGU9KDAscy5kZWZhdWx0KSh0aGlzLmdyb3Vwcyk7ZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMToxfSk7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07MSE9dGhpcy5ncm91cHNbb10udmlzaWJsZXx8dm9pZCAwIT09dGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbb10mJjEhPXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W29dfHx0Kyt9aWYoMD09dGhpcy5vcHRpb25zW3RoaXMuc2lkZV0udmlzaWJsZXx8MD09dGhpcy5hbW91bnRPZkdyb3Vwc3x8MD09dGhpcy5vcHRpb25zLmVuYWJsZWR8fDA9PXQpdGhpcy5oaWRlKCk7ZWxzZXtpZih0aGlzLnNob3coKSwidG9wLWxlZnQiPT10aGlzLm9wdGlvbnNbdGhpcy5zaWRlXS5wb3NpdGlvbnx8ImJvdHRvbS1sZWZ0Ij09dGhpcy5vcHRpb25zW3RoaXMuc2lkZV0ucG9zaXRpb24/KHRoaXMuZG9tLmZyYW1lLnN0eWxlLmxlZnQ9IjRweCIsdGhpcy5kb20uZnJhbWUuc3R5bGUudGV4dEFsaWduPSJsZWZ0Iix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS50ZXh0QWxpZ249ImxlZnQiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLmxlZnQ9dGhpcy5vcHRpb25zLmljb25TaXplKzE1KyJweCIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUucmlnaHQ9IiIsdGhpcy5zdmcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLnN2Zy5zdHlsZS5yaWdodD0iIik6KHRoaXMuZG9tLmZyYW1lLnN0eWxlLnJpZ2h0PSI0cHgiLHRoaXMuZG9tLmZyYW1lLnN0eWxlLnRleHRBbGlnbj0icmlnaHQiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLnRleHRBbGlnbj0icmlnaHQiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLnJpZ2h0PXRoaXMub3B0aW9ucy5pY29uU2l6ZSsxNSsicHgiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLmxlZnQ9IiIsdGhpcy5zdmcuc3R5bGUucmlnaHQ9IjBweCIsdGhpcy5zdmcuc3R5bGUubGVmdD0iIiksInRvcC1sZWZ0Ij09dGhpcy5vcHRpb25zW3RoaXMuc2lkZV0ucG9zaXRpb258fCJ0b3AtcmlnaHQiPT10aGlzLm9wdGlvbnNbdGhpcy5zaWRlXS5wb3NpdGlvbil0aGlzLmRvbS5mcmFtZS5zdHlsZS50b3A9NC1OdW1iZXIodGhpcy5ib2R5LmRvbS5jZW50ZXIuc3R5bGUudG9wLnJlcGxhY2UoInB4IiwiIikpKyJweCIsdGhpcy5kb20uZnJhbWUuc3R5bGUuYm90dG9tPSIiO2Vsc2V7dmFyIG49dGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlci5oZWlnaHQtdGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQ7dGhpcy5kb20uZnJhbWUuc3R5bGUuYm90dG9tPTQrbitOdW1iZXIodGhpcy5ib2R5LmRvbS5jZW50ZXIuc3R5bGUudG9wLnJlcGxhY2UoInB4IiwiIikpKyJweCIsdGhpcy5kb20uZnJhbWUuc3R5bGUudG9wPSIifTA9PXRoaXMub3B0aW9ucy5pY29ucz8odGhpcy5kb20uZnJhbWUuc3R5bGUud2lkdGg9dGhpcy5kb20udGV4dEFyZWEub2Zmc2V0V2lkdGgrMTArInB4Iix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5yaWdodD0iIix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5sZWZ0PSIiLHRoaXMuc3ZnLnN0eWxlLndpZHRoPSIwcHgiKToodGhpcy5kb20uZnJhbWUuc3R5bGUud2lkdGg9dGhpcy5vcHRpb25zLmljb25TaXplKzE1K3RoaXMuZG9tLnRleHRBcmVhLm9mZnNldFdpZHRoKzEwKyJweCIsdGhpcy5kcmF3TGVnZW5kSWNvbnMoKSk7Zm9yKHZhciByPSIiLGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTsxIT10aGlzLmdyb3Vwc1tvXS52aXNpYmxlfHx2b2lkIDAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtvXSYmMSE9dGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbb118fChyKz10aGlzLmdyb3Vwc1tvXS5jb250ZW50KyI8YnIgLz4iKX10aGlzLmRvbS50ZXh0QXJlYS5pbm5lckhUTUw9cix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5saW5lSGVpZ2h0PS43NSp0aGlzLm9wdGlvbnMuaWNvblNpemUrdGhpcy5vcHRpb25zLmljb25TcGFjaW5nKyJweCJ9fSxvLnByb3RvdHlwZS5kcmF3TGVnZW5kSWNvbnM9ZnVuY3Rpb24oKXtpZih0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlKXt2YXIgdD0oMCxzLmRlZmF1bHQpKHRoaXMuZ3JvdXBzKTt0LnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlPy0xOjF9KSxhLnJlc2V0RWxlbWVudHModGhpcy5zdmdFbGVtZW50cyk7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5kb20uZnJhbWUpLnBhZGRpbmdUb3AsaT1OdW1iZXIoZS5yZXBsYWNlKCJweCIsIiIpKSxvPWksbj10aGlzLm9wdGlvbnMuaWNvblNpemUscj0uNzUqdGhpcy5vcHRpb25zLmljb25TaXplLGg9aSsuNSpyKzM7dGhpcy5zdmcuc3R5bGUud2lkdGg9bis1K2krInB4Ijtmb3IodmFyIGQ9MDtkPHQubGVuZ3RoO2QrKyl7dmFyIGw9dFtkXTsxIT10aGlzLmdyb3Vwc1tsXS52aXNpYmxlfHx2b2lkIDAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtsXSYmMSE9dGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbbF18fCh0aGlzLmdyb3Vwc1tsXS5nZXRMZWdlbmQobixyLHRoaXMuZnJhbWV3b3JrLG8saCksaCs9cit0aGlzLm9wdGlvbnMuaWNvblNwYWNpbmcpfX19LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT0ic3RyaW5nIixvPSJib29sZWFuIixuPSJudW1iZXIiLHM9Im9iamVjdCIscj17Y29uZmlndXJlOntlbmFibGVkOntib29sZWFuOm99LGZpbHRlcjp7Ym9vbGVhbjpvLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9LGNvbnRhaW5lcjp7ZG9tOiJkb20ifSxfX3R5cGVfXzp7b2JqZWN0OnMsYm9vbGVhbjpvLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9fSx5QXhpc09yaWVudGF0aW9uOntzdHJpbmc6WyJsZWZ0IiwicmlnaHQiXX0sZGVmYXVsdEdyb3VwOntzdHJpbmc6aX0sc29ydDp7Ym9vbGVhbjpvfSxzYW1wbGluZzp7Ym9vbGVhbjpvfSxzdGFjazp7Ym9vbGVhbjpvfSxncmFwaEhlaWdodDp7c3RyaW5nOmksbnVtYmVyOm59LHNoYWRlZDp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxvcmllbnRhdGlvbjp7c3RyaW5nOlsiYm90dG9tIiwidG9wIiwiemVybyIsImdyb3VwIl19LGdyb3VwSWQ6e29iamVjdDpzfSxfX3R5cGVfXzp7Ym9vbGVhbjpvLG9iamVjdDpzfX0sc3R5bGU6e3N0cmluZzpbImxpbmUiLCJiYXIiLCJwb2ludHMiXX0sYmFyQ2hhcnQ6e3dpZHRoOntudW1iZXI6bn0sbWluV2lkdGg6e251bWJlcjpufSxzaWRlQnlTaWRlOntib29sZWFuOm99LGFsaWduOntzdHJpbmc6WyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiXX0sX190eXBlX186e29iamVjdDpzfX0saW50ZXJwb2xhdGlvbjp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxwYXJhbWV0cml6YXRpb246e3N0cmluZzpbImNlbnRyaXBldGFsIiwiY2hvcmRhbCIsInVuaWZvcm0iXX0sYWxwaGE6e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnMsYm9vbGVhbjpvfX0sZHJhd1BvaW50czp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxvblJlbmRlcjp7ZnVuY3Rpb246ImZ1bmN0aW9uIn0sc2l6ZTp7bnVtYmVyOm59LHN0eWxlOntzdHJpbmc6WyJzcXVhcmUiLCJjaXJjbGUiXX0sX190eXBlX186e29iamVjdDpzLGJvb2xlYW46byxmdW5jdGlvbjoiZnVuY3Rpb24ifX0sZGF0YUF4aXM6e3Nob3dNaW5vckxhYmVsczp7Ym9vbGVhbjpvfSxzaG93TWFqb3JMYWJlbHM6e2Jvb2xlYW46b30saWNvbnM6e2Jvb2xlYW46b30sd2lkdGg6e3N0cmluZzppLG51bWJlcjpufSx2aXNpYmxlOntib29sZWFuOm99LGFsaWduWmVyb3M6e2Jvb2xlYW46b30sbGVmdDp7cmFuZ2U6e21pbjp7bnVtYmVyOm4sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxtYXg6e251bWJlcjpuLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sX190eXBlX186e29iamVjdDpzfX0sZm9ybWF0OntmdW5jdGlvbjoiZnVuY3Rpb24ifSx0aXRsZTp7dGV4dDp7c3RyaW5nOmksbnVtYmVyOm4sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxzdHlsZTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxyaWdodDp7cmFuZ2U6e21pbjp7bnVtYmVyOm4sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxtYXg6e251bWJlcjpuLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sX190eXBlX186e29iamVjdDpzfX0sZm9ybWF0OntmdW5jdGlvbjoiZnVuY3Rpb24ifSx0aXRsZTp7dGV4dDp7c3RyaW5nOmksbnVtYmVyOm4sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxzdHlsZTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxsZWdlbmQ6e2VuYWJsZWQ6e2Jvb2xlYW46b30saWNvbnM6e2Jvb2xlYW46b30sbGVmdDp7dmlzaWJsZTp7Ym9vbGVhbjpvfSxwb3NpdGlvbjp7c3RyaW5nOlsidG9wLXJpZ2h0IiwiYm90dG9tLXJpZ2h0IiwidG9wLWxlZnQiLCJib3R0b20tbGVmdCJdfSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxyaWdodDp7dmlzaWJsZTp7Ym9vbGVhbjpvfSxwb3NpdGlvbjp7c3RyaW5nOlsidG9wLXJpZ2h0IiwiYm90dG9tLXJpZ2h0IiwidG9wLWxlZnQiLCJib3R0b20tbGVmdCJdfSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxfX3R5cGVfXzp7b2JqZWN0OnMsYm9vbGVhbjpvfX0sZ3JvdXBzOnt2aXNpYmlsaXR5Onthbnk6ImFueSJ9LF9fdHlwZV9fOntvYmplY3Q6c319LGF1dG9SZXNpemU6e2Jvb2xlYW46b30sdGhyb3R0bGVSZWRyYXc6e251bWJlcjpufSxjbGlja1RvVXNlOntib29sZWFuOm99LGVuZDp7bnVtYmVyOm4sZGF0ZToiZGF0ZSIsc3RyaW5nOmksbW9tZW50OiJtb21lbnQifSxmb3JtYXQ6e21pbm9yTGFiZWxzOnttaWxsaXNlY29uZDp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxzZWNvbmQ6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sbWludXRlOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LGhvdXI6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sd2Vla2RheTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxkYXk6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sbW9udGg6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0seWVhcjp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxtYWpvckxhYmVsczp7bWlsbGlzZWNvbmQ6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sc2Vjb25kOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LG1pbnV0ZTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxob3VyOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHdlZWtkYXk6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sZGF5OntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LG1vbnRoOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHllYXI6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sX190eXBlX186e29iamVjdDpzfX0sX190eXBlX186e29iamVjdDpzfX0sbW9tZW50OntmdW5jdGlvbjoiZnVuY3Rpb24ifSxoZWlnaHQ6e3N0cmluZzppLG51bWJlcjpufSxoaWRkZW5EYXRlczp7c3RhcnQ6e2RhdGU6ImRhdGUiLG51bWJlcjpuLHN0cmluZzppLG1vbWVudDoibW9tZW50In0sZW5kOntkYXRlOiJkYXRlIixudW1iZXI6bixzdHJpbmc6aSxtb21lbnQ6Im1vbWVudCJ9LHJlcGVhdDp7c3RyaW5nOml9LF9fdHlwZV9fOntvYmplY3Q6cyxhcnJheToiYXJyYXkifX0sbG9jYWxlOntzdHJpbmc6aX0sbG9jYWxlczp7X19hbnlfXzp7YW55OiJhbnkifSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxtYXg6e2RhdGU6ImRhdGUiLG51bWJlcjpuLHN0cmluZzppLG1vbWVudDoibW9tZW50In0sbWF4SGVpZ2h0OntudW1iZXI6bixzdHJpbmc6aX0sbWF4TWlub3JDaGFyczp7bnVtYmVyOm59LG1pbjp7ZGF0ZToiZGF0ZSIsbnVtYmVyOm4sc3RyaW5nOmksbW9tZW50OiJtb21lbnQifSxtaW5IZWlnaHQ6e251bWJlcjpuLHN0cmluZzppfSxtb3ZlYWJsZTp7Ym9vbGVhbjpvfSxtdWx0aXNlbGVjdDp7Ym9vbGVhbjpvfSxvcmllbnRhdGlvbjp7c3RyaW5nOml9LHNob3dDdXJyZW50VGltZTp7Ym9vbGVhbjpvfSxzaG93TWFqb3JMYWJlbHM6e2Jvb2xlYW46b30sc2hvd01pbm9yTGFiZWxzOntib29sZWFuOm99LHN0YXJ0OntkYXRlOiJkYXRlIixudW1iZXI6bixzdHJpbmc6aSxtb21lbnQ6Im1vbWVudCJ9LHRpbWVBeGlzOntzY2FsZTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxzdGVwOntudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntvYmplY3Q6c319LHdpZHRoOntzdHJpbmc6aSxudW1iZXI6bn0sem9vbWFibGU6e2Jvb2xlYW46b30sem9vbUtleTp7c3RyaW5nOlsiY3RybEtleSIsImFsdEtleSIsIm1ldGFLZXkiLCIiXX0sem9vbU1heDp7bnVtYmVyOm59LHpvb21NaW46e251bWJlcjpufSx6SW5kZXg6e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxhPXtnbG9iYWw6e3NvcnQ6ITAsc2FtcGxpbmc6ITAsc3RhY2s6ITEsc2hhZGVkOntlbmFibGVkOiExLG9yaWVudGF0aW9uOlsiemVybyIsInRvcCIsImJvdHRvbSIsImdyb3VwIl19LHN0eWxlOlsibGluZSIsImJhciIsInBvaW50cyJdLGJhckNoYXJ0Ont3aWR0aDpbNTAsNSwxMDAsNV0sbWluV2lkdGg6WzUwLDUsMTAwLDVdLHNpZGVCeVNpZGU6ITEsYWxpZ246WyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiXX0saW50ZXJwb2xhdGlvbjp7ZW5hYmxlZDohMCxwYXJhbWV0cml6YXRpb246WyJjZW50cmlwZXRhbCIsImNob3JkYWwiLCJ1bmlmb3JtIl19LGRyYXdQb2ludHM6e2VuYWJsZWQ6ITAsc2l6ZTpbNiwyLDMwLDFdLHN0eWxlOlsic3F1YXJlIiwiY2lyY2xlIl19LGRhdGFBeGlzOntzaG93TWlub3JMYWJlbHM6ITAsc2hvd01ham9yTGFiZWxzOiEwLGljb25zOiExLHdpZHRoOls0MCwwLDIwMCwxXSx2aXNpYmxlOiEwLGFsaWduWmVyb3M6ITAsbGVmdDp7dGl0bGU6e3RleHQ6IiIsc3R5bGU6IiJ9fSxyaWdodDp7dGl0bGU6e3RleHQ6IiIsc3R5bGU6IiJ9fX0sbGVnZW5kOntlbmFibGVkOiExLGljb25zOiEwLGxlZnQ6e3Zpc2libGU6ITAscG9zaXRpb246WyJ0b3AtcmlnaHQiLCJib3R0b20tcmlnaHQiLCJ0b3AtbGVmdCIsImJvdHRvbS1sZWZ0Il19LHJpZ2h0Ont2aXNpYmxlOiEwLHBvc2l0aW9uOlsidG9wLXJpZ2h0IiwiYm90dG9tLXJpZ2h0IiwidG9wLWxlZnQiLCJib3R0b20tbGVmdCJdfX0sYXV0b1Jlc2l6ZTohMCxjbGlja1RvVXNlOiExLGVuZDoiIixmb3JtYXQ6e21pbm9yTGFiZWxzOnttaWxsaXNlY29uZDoiU1NTIixzZWNvbmQ6InMiLG1pbnV0ZToiSEg6bW0iLGhvdXI6IkhIOm1tIix3ZWVrZGF5OiJkZGQgRCIsZGF5OiJEIixtb250aDoiTU1NIix5ZWFyOiJZWVlZIn0sbWFqb3JMYWJlbHM6e21pbGxpc2Vjb25kOiJISDptbTpzcyIsc2Vjb25kOiJEIE1NTU0gSEg6bW0iLG1pbnV0ZToiZGRkIEQgTU1NTSIsaG91cjoiZGRkIEQgTU1NTSIsd2Vla2RheToiTU1NTSBZWVlZIixkYXk6Ik1NTU0gWVlZWSIsbW9udGg6IllZWVkiLHllYXI6IiJ9fSxoZWlnaHQ6IiIsbG9jYWxlOiIiLG1heDoiIixtYXhIZWlnaHQ6IiIsbWF4TWlub3JDaGFyczpbNywwLDIwLDFdLG1pbjoiIixtaW5IZWlnaHQ6IiIsbW92ZWFibGU6ITAsb3JpZW50YXRpb246WyJib3RoIiwiYm90dG9tIiwidG9wIl0sc2hvd0N1cnJlbnRUaW1lOiExLHNob3dNYWpvckxhYmVsczohMCxzaG93TWlub3JMYWJlbHM6ITAsc3RhcnQ6IiIsd2lkdGg6IjEwMCUiLHpvb21hYmxlOiEwLHpvb21LZXk6WyJjdHJsS2V5IiwiYWx0S2V5IiwibWV0YUtleSIsIiJdLHpvb21NYXg6WzMxNTM2ZTEwLDEwLDMxNTM2ZTEwLDFdLHpvb21NaW46WzEwLDEwLDMxNTM2ZTEwLDFdLHpJbmRleDowfX07ZS5hbGxPcHRpb25zPXIsZS5jb25maWd1cmVPcHRpb25zPWF9LGZ1bmN0aW9uKHQsZSxpKXtlLnV0aWw9aSgxKSxlLkRPTXV0aWw9aSg4OCksZS5EYXRhU2V0PWkoODkpLGUuRGF0YVZpZXc9aSg5MyksZS5RdWV1ZT1pKDkyKSxlLk5ldHdvcms9aSgxNTkpLGUubmV0d29yaz17SW1hZ2VzOmkoMTY0KSxkb3RwYXJzZXI6aSgxNjEpLGdlcGhpUGFyc2VyOmkoMTYyKSxhbGxPcHRpb25zOmkoMjI5KX0sZS5uZXR3b3JrLmNvbnZlcnREb3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGUubmV0d29yay5kb3RwYXJzZXIuRE9UVG9HcmFwaCh0KX0sZS5uZXR3b3JrLmNvbnZlcnRHZXBoaT1mdW5jdGlvbih0LGkpe3JldHVybiBlLm5ldHdvcmsuZ2VwaGlQYXJzZXIucGFyc2VHZXBoaSh0LGkpfSxlLm1vbWVudD1pKDgyKSxlLkhhbW1lcj1pKDExMiksZS5rZXljaGFybT1pKDExNSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXt2YXIgbj10aGlzO2lmKCEodGhpcyBpbnN0YW5jZW9mIG8pKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7dGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e2xvY2FsZToiZW4iLGxvY2FsZXM6ZCxjbGlja1RvVXNlOiExfSxzLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5ib2R5PXtjb250YWluZXI6dCxub2Rlczp7fSxub2RlSW5kaWNlczpbXSxlZGdlczp7fSxlZGdlSW5kaWNlczpbXSxlbWl0dGVyOntvbjp0aGlzLm9uLmJpbmQodGhpcyksb2ZmOnRoaXMub2ZmLmJpbmQodGhpcyksZW1pdDp0aGlzLmVtaXQuYmluZCh0aGlzKSxvbmNlOnRoaXMub25jZS5iaW5kKHRoaXMpfSxldmVudExpc3RlbmVyczp7b25UYXA6ZnVuY3Rpb24oKXt9LG9uVG91Y2g6ZnVuY3Rpb24oKXt9LG9uRG91YmxlVGFwOmZ1bmN0aW9uKCl7fSxvbkhvbGQ6ZnVuY3Rpb24oKXt9LG9uRHJhZ1N0YXJ0OmZ1bmN0aW9uKCl7fSxvbkRyYWc6ZnVuY3Rpb24oKXt9LG9uRHJhZ0VuZDpmdW5jdGlvbigpe30sb25Nb3VzZVdoZWVsOmZ1bmN0aW9uKCl7fSxvblBpbmNoOmZ1bmN0aW9uKCl7fSxvbk1vdXNlTW92ZTpmdW5jdGlvbigpe30sb25SZWxlYXNlOmZ1bmN0aW9uKCl7fSxvbkNvbnRleHQ6ZnVuY3Rpb24oKXt9fSxkYXRhOntub2RlczpudWxsLGVkZ2VzOm51bGx9LGZ1bmN0aW9uczp7Y3JlYXRlTm9kZTpmdW5jdGlvbigpe30sY3JlYXRlRWRnZTpmdW5jdGlvbigpe30sZ2V0UG9pbnRlcjpmdW5jdGlvbigpe319LG1vZHVsZXM6e30sdmlldzp7c2NhbGU6MSx0cmFuc2xhdGlvbjp7eDowLHk6MH19fSx0aGlzLmJpbmRFdmVudExpc3RlbmVycygpLHRoaXMuaW1hZ2VzPW5ldyBsKGZ1bmN0aW9uKCl7cmV0dXJuIG4uYm9keS5lbWl0dGVyLmVtaXQoIl9yZXF1ZXN0UmVkcmF3Iil9KSx0aGlzLmdyb3Vwcz1uZXcgdSx0aGlzLmNhbnZhcz1uZXcgZyh0aGlzLmJvZHkpLHRoaXMuc2VsZWN0aW9uSGFuZGxlcj1uZXcgXyh0aGlzLmJvZHksdGhpcy5jYW52YXMpLHRoaXMuaW50ZXJhY3Rpb25IYW5kbGVyPW5ldyBiKHRoaXMuYm9keSx0aGlzLmNhbnZhcyx0aGlzLnNlbGVjdGlvbkhhbmRsZXIpLHRoaXMudmlldz1uZXcgeSh0aGlzLmJvZHksdGhpcy5jYW52YXMpLHRoaXMucmVuZGVyZXI9bmV3IHYodGhpcy5ib2R5LHRoaXMuY2FudmFzKSx0aGlzLnBoeXNpY3M9bmV3IGYodGhpcy5ib2R5KSx0aGlzLmxheW91dEVuZ2luZT1uZXcgdyh0aGlzLmJvZHkpLHRoaXMuY2x1c3RlcmluZz1uZXcgbSh0aGlzLmJvZHkpLHRoaXMubWFuaXB1bGF0aW9uPW5ldyB4KHRoaXMuYm9keSx0aGlzLmNhbnZhcyx0aGlzLnNlbGVjdGlvbkhhbmRsZXIpLHRoaXMubm9kZXNIYW5kbGVyPW5ldyBjKHRoaXMuYm9keSx0aGlzLmltYWdlcyx0aGlzLmdyb3Vwcyx0aGlzLmxheW91dEVuZ2luZSksdGhpcy5lZGdlc0hhbmRsZXI9bmV3IHAodGhpcy5ib2R5LHRoaXMuaW1hZ2VzLHRoaXMuZ3JvdXBzKSx0aGlzLmJvZHkubW9kdWxlcy5rYW1hZGFLYXdhaT1uZXcgRSh0aGlzLmJvZHksMTUwLC4wNSksdGhpcy5ib2R5Lm1vZHVsZXMuY2x1c3RlcmluZz10aGlzLmNsdXN0ZXJpbmcsdGhpcy5jYW52YXMuX2NyZWF0ZSgpLHRoaXMuc2V0T3B0aW9ucyhpKSx0aGlzLnNldERhdGEoZSl9aSgxNjApO3ZhciBuPWkoOTkpLHM9aSgxKSxyPShpKDg5KSxpKDkzKSxpKDE2MSkpLGE9aSgxNjIpLGg9aSgxNDApLGQ9aSgxNjMpLGw9aSgxNjQpLmRlZmF1bHQsdT1pKDE2NikuZGVmYXVsdCxjPWkoMTY3KS5kZWZhdWx0LHA9aSgyMDApLmRlZmF1bHQsZj1pKDIwOSkuZGVmYXVsdCxtPWkoMjE4KS5kZWZhdWx0LHY9aSgyMjEpLmRlZmF1bHQsZz1pKDIyMikuZGVmYXVsdCx5PWkoMjIzKS5kZWZhdWx0LGI9aSgyMjQpLmRlZmF1bHQsXz1pKDIyNikuZGVmYXVsdCx3PWkoMjI3KS5kZWZhdWx0LHg9aSgyMjgpLmRlZmF1bHQsaz1pKDE0NikuZGVmYXVsdCxNPWkoMTQ0KS5kZWZhdWx0LFM9aSgxNDQpLEQ9Uy5wcmludFN0eWxlLE89aSgyMjkpLEM9Ty5hbGxPcHRpb25zLFQ9Ty5jb25maWd1cmVPcHRpb25zLEU9aSgyMzApLmRlZmF1bHQ7bihvLnByb3RvdHlwZSksby5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHZvaWQgMCE9PXQpeyEwPT09TS52YWxpZGF0ZSh0LEMpJiZjb25zb2xlLmxvZygiJWNFcnJvcnMgaGF2ZSBiZWVuIGZvdW5kIGluIHRoZSBzdXBwbGllZCBvcHRpb25zIG9iamVjdC4iLEQpO3ZhciBpPVsibG9jYWxlIiwibG9jYWxlcyIsImNsaWNrVG9Vc2UiXTtpZihzLnNlbGVjdGl2ZURlZXBFeHRlbmQoaSx0aGlzLm9wdGlvbnMsdCksdD10aGlzLmxheW91dEVuZ2luZS5zZXRPcHRpb25zKHQubGF5b3V0LHQpLHRoaXMuY2FudmFzLnNldE9wdGlvbnModCksdGhpcy5ncm91cHMuc2V0T3B0aW9ucyh0Lmdyb3VwcyksdGhpcy5ub2Rlc0hhbmRsZXIuc2V0T3B0aW9ucyh0Lm5vZGVzKSx0aGlzLmVkZ2VzSGFuZGxlci5zZXRPcHRpb25zKHQuZWRnZXMpLHRoaXMucGh5c2ljcy5zZXRPcHRpb25zKHQucGh5c2ljcyksdGhpcy5tYW5pcHVsYXRpb24uc2V0T3B0aW9ucyh0Lm1hbmlwdWxhdGlvbix0LHRoaXMub3B0aW9ucyksdGhpcy5pbnRlcmFjdGlvbkhhbmRsZXIuc2V0T3B0aW9ucyh0LmludGVyYWN0aW9uKSx0aGlzLnJlbmRlcmVyLnNldE9wdGlvbnModC5pbnRlcmFjdGlvbiksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNldE9wdGlvbnModC5pbnRlcmFjdGlvbiksdm9pZCAwIT09dC5ncm91cHMmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInJlZnJlc2hOb2RlcyIpLCJjb25maWd1cmUiaW4gdCYmKHRoaXMuY29uZmlndXJhdG9yfHwodGhpcy5jb25maWd1cmF0b3I9bmV3IGsodGhpcyx0aGlzLmJvZHkuY29udGFpbmVyLFQsdGhpcy5jYW52YXMucGl4ZWxSYXRpbykpLHRoaXMuY29uZmlndXJhdG9yLnNldE9wdGlvbnModC5jb25maWd1cmUpKSx0aGlzLmNvbmZpZ3VyYXRvciYmITA9PT10aGlzLmNvbmZpZ3VyYXRvci5vcHRpb25zLmVuYWJsZWQpe3ZhciBvPXtub2Rlczp7fSxlZGdlczp7fSxsYXlvdXQ6e30saW50ZXJhY3Rpb246e30sbWFuaXB1bGF0aW9uOnt9LHBoeXNpY3M6e30sZ2xvYmFsOnt9fTtzLmRlZXBFeHRlbmQoby5ub2Rlcyx0aGlzLm5vZGVzSGFuZGxlci5vcHRpb25zKSxzLmRlZXBFeHRlbmQoby5lZGdlcyx0aGlzLmVkZ2VzSGFuZGxlci5vcHRpb25zKSxzLmRlZXBFeHRlbmQoby5sYXlvdXQsdGhpcy5sYXlvdXRFbmdpbmUub3B0aW9ucykscy5kZWVwRXh0ZW5kKG8uaW50ZXJhY3Rpb24sdGhpcy5zZWxlY3Rpb25IYW5kbGVyLm9wdGlvbnMpLHMuZGVlcEV4dGVuZChvLmludGVyYWN0aW9uLHRoaXMucmVuZGVyZXIub3B0aW9ucykscy5kZWVwRXh0ZW5kKG8uaW50ZXJhY3Rpb24sdGhpcy5pbnRlcmFjdGlvbkhhbmRsZXIub3B0aW9ucykscy5kZWVwRXh0ZW5kKG8ubWFuaXB1bGF0aW9uLHRoaXMubWFuaXB1bGF0aW9uLm9wdGlvbnMpLHMuZGVlcEV4dGVuZChvLnBoeXNpY3MsdGhpcy5waHlzaWNzLm9wdGlvbnMpLHMuZGVlcEV4dGVuZChvLmdsb2JhbCx0aGlzLmNhbnZhcy5vcHRpb25zKSxzLmRlZXBFeHRlbmQoby5nbG9iYWwsdGhpcy5vcHRpb25zKSx0aGlzLmNvbmZpZ3VyYXRvci5zZXRNb2R1bGVPcHRpb25zKG8pfXZvaWQgMCE9PXQuY2xpY2tUb1VzZT8hMD09PXQuY2xpY2tUb1VzZT92b2lkIDA9PT10aGlzLmFjdGl2YXRvciYmKHRoaXMuYWN0aXZhdG9yPW5ldyBoKHRoaXMuY2FudmFzLmZyYW1lKSx0aGlzLmFjdGl2YXRvci5vbigiY2hhbmdlIixmdW5jdGlvbigpe2UuYm9keS5lbWl0dGVyLmVtaXQoImFjdGl2YXRlIil9KSk6KHZvaWQgMCE9PXRoaXMuYWN0aXZhdG9yJiYodGhpcy5hY3RpdmF0b3IuZGVzdHJveSgpLGRlbGV0ZSB0aGlzLmFjdGl2YXRvciksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiYWN0aXZhdGUiKSk6dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiYWN0aXZhdGUiKSx0aGlzLmNhbnZhcy5zZXRTaXplKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgic3RhcnRTaW11bGF0aW9uIil9fSxvLnByb3RvdHlwZS5fdXBkYXRlVmlzaWJsZUluZGljZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJvZHkubm9kZXMsZT10aGlzLmJvZHkuZWRnZXM7dGhpcy5ib2R5Lm5vZGVJbmRpY2VzPVtdLHRoaXMuYm9keS5lZGdlSW5kaWNlcz1bXTtmb3IodmFyIGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiYhMT09PXRbaV0ub3B0aW9ucy5oaWRkZW4mJnRoaXMuYm9keS5ub2RlSW5kaWNlcy5wdXNoKHRbaV0uaWQpO2Zvcih2YXIgbyBpbiBlKWUuaGFzT3duUHJvcGVydHkobykmJiExPT09ZVtvXS5vcHRpb25zLmhpZGRlbiYmdGhpcy5ib2R5LmVkZ2VJbmRpY2VzLnB1c2goZVtvXS5pZCl9LG8ucHJvdG90eXBlLmJpbmRFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub24oIl9kYXRhQ2hhbmdlZCIsZnVuY3Rpb24oKXt0Ll91cGRhdGVWaXNpYmxlSW5kaWNlcygpLHQuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXF1ZXN0UmVkcmF3IiksdC5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFVcGRhdGVkIil9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX2RhdGFVcGRhdGVkIixmdW5jdGlvbigpe3QuX3VwZGF0ZVZhbHVlUmFuZ2UodC5ib2R5Lm5vZGVzKSx0Ll91cGRhdGVWYWx1ZVJhbmdlKHQuYm9keS5lZGdlcyksdC5ib2R5LmVtaXR0ZXIuZW1pdCgic3RhcnRTaW11bGF0aW9uIiksdC5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlcXVlc3RSZWRyYXciKX0pfSxvLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe2lmKHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInJlc2V0UGh5c2ljcyIpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXNldERhdGEiKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSx0JiZ0LmRvdCYmKHQubm9kZXN8fHQuZWRnZXMpKXRocm93IG5ldyBTeW50YXhFcnJvcignRGF0YSBtdXN0IGNvbnRhaW4gZWl0aGVyIHBhcmFtZXRlciAiZG90IiBvciAgcGFyYW1ldGVyIHBhaXIgIm5vZGVzIiBhbmQgImVkZ2VzIiwgYnV0IG5vdCBib3RoLicpO2lmKHRoaXMuc2V0T3B0aW9ucyh0JiZ0Lm9wdGlvbnMpLHQmJnQuZG90KXtjb25zb2xlLmxvZygiVGhlIGRvdCBwcm9wZXJ0eSBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBzdGF0aWMgY29udmVydERvdCBtZXRob2QgdG8gY29udmVydCBET1QgaW50byB2aXMubmV0d29yayBmb3JtYXQgYW5kIHVzZSB0aGUgbm9ybWFsIGRhdGEgZm9ybWF0IHdpdGggbm9kZXMgYW5kIGVkZ2VzLiBUaGlzIGNvbnZlcnRlciBpcyB1c2VkIGxpa2UgdGhpczogdmFyIGRhdGEgPSB2aXMubmV0d29yay5jb252ZXJ0RG90KGRvdFN0cmluZyk7Iik7dmFyIGU9ci5ET1RUb0dyYXBoKHQuZG90KTtyZXR1cm4gdm9pZCB0aGlzLnNldERhdGEoZSl9aWYodCYmdC5nZXBoaSl7Y29uc29sZS5sb2coIlRoZSBnZXBoaSBwcm9wZXJ0eSBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBzdGF0aWMgY29udmVydEdlcGhpIG1ldGhvZCB0byBjb252ZXJ0IGdlcGhpIGludG8gdmlzLm5ldHdvcmsgZm9ybWF0IGFuZCB1c2UgdGhlIG5vcm1hbCBkYXRhIGZvcm1hdCB3aXRoIG5vZGVzIGFuZCBlZGdlcy4gVGhpcyBjb252ZXJ0ZXIgaXMgdXNlZCBsaWtlIHRoaXM6IHZhciBkYXRhID0gdmlzLm5ldHdvcmsuY29udmVydEdlcGhpKGdlcGhpSnNvbik7Iik7dmFyIGk9YS5wYXJzZUdlcGhpKHQuZ2VwaGkpO3JldHVybiB2b2lkIHRoaXMuc2V0RGF0YShpKX10aGlzLm5vZGVzSGFuZGxlci5zZXREYXRhKHQmJnQubm9kZXMsITApLHRoaXMuZWRnZXNIYW5kbGVyLnNldERhdGEodCYmdC5lZGdlcywhMCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIiksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFMb2FkZWQiKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJpbml0UGh5c2ljcyIpfSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiZGVzdHJveSIpLHRoaXMuYm9keS5lbWl0dGVyLm9mZigpLHRoaXMub2ZmKCksZGVsZXRlIHRoaXMuZ3JvdXBzLGRlbGV0ZSB0aGlzLmNhbnZhcyxkZWxldGUgdGhpcy5zZWxlY3Rpb25IYW5kbGVyLGRlbGV0ZSB0aGlzLmludGVyYWN0aW9uSGFuZGxlcixkZWxldGUgdGhpcy52aWV3LGRlbGV0ZSB0aGlzLnJlbmRlcmVyLGRlbGV0ZSB0aGlzLnBoeXNpY3MsZGVsZXRlIHRoaXMubGF5b3V0RW5naW5lLGRlbGV0ZSB0aGlzLmNsdXN0ZXJpbmcsZGVsZXRlIHRoaXMubWFuaXB1bGF0aW9uLGRlbGV0ZSB0aGlzLm5vZGVzSGFuZGxlcixkZWxldGUgdGhpcy5lZGdlc0hhbmRsZXIsZGVsZXRlIHRoaXMuY29uZmlndXJhdG9yLGRlbGV0ZSB0aGlzLmltYWdlcztmb3IodmFyIHQgaW4gdGhpcy5ib2R5Lm5vZGVzKWRlbGV0ZSB0aGlzLmJvZHkubm9kZXNbdF07Zm9yKHZhciBlIGluIHRoaXMuYm9keS5lZGdlcylkZWxldGUgdGhpcy5ib2R5LmVkZ2VzW2VdO3MucmVjdXJzaXZlRE9NRGVsZXRlKHRoaXMuYm9keS5jb250YWluZXIpfSxvLnByb3RvdHlwZS5fdXBkYXRlVmFsdWVSYW5nZT1mdW5jdGlvbih0KXt2YXIgZSxpPXZvaWQgMCxvPXZvaWQgMCxuPTA7Zm9yKGUgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGUpKXt2YXIgcz10W2VdLmdldFZhbHVlKCk7dm9pZCAwIT09cyYmKGk9dm9pZCAwPT09aT9zOk1hdGgubWluKHMsaSksbz12b2lkIDA9PT1vP3M6TWF0aC5tYXgocyxvKSxuKz1zKX1pZih2b2lkIDAhPT1pJiZ2b2lkIDAhPT1vKWZvcihlIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShlKSYmdFtlXS5zZXRWYWx1ZVJhbmdlKGksbyxuKX0sby5wcm90b3R5cGUuaXNBY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5hY3RpdmF0b3J8fHRoaXMuYWN0aXZhdG9yLmFjdGl2ZX0sby5wcm90b3R5cGUuc2V0U2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbnZhcy5zZXRTaXplLmFwcGx5KHRoaXMuY2FudmFzLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmNhbnZhc1RvRE9NPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzLmNhbnZhc1RvRE9NLmFwcGx5KHRoaXMuY2FudmFzLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLkRPTXRvQ2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzLkRPTXRvQ2FudmFzLmFwcGx5KHRoaXMuY2FudmFzLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmZpbmROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2x1c3RlcmluZy5maW5kTm9kZS5hcHBseSh0aGlzLmNsdXN0ZXJpbmcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuaXNDbHVzdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2x1c3RlcmluZy5pc0NsdXN0ZXIuYXBwbHkodGhpcy5jbHVzdGVyaW5nLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLm9wZW5DbHVzdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2x1c3RlcmluZy5vcGVuQ2x1c3Rlci5hcHBseSh0aGlzLmNsdXN0ZXJpbmcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuY2x1c3Rlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsdXN0ZXJpbmcuY2x1c3Rlci5hcHBseSh0aGlzLmNsdXN0ZXJpbmcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0Tm9kZXNJbkNsdXN0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmdldE5vZGVzSW5DbHVzdGVyLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5jbHVzdGVyQnlDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2x1c3RlcmluZy5jbHVzdGVyQnlDb25uZWN0aW9uLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5jbHVzdGVyQnlIdWJzaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2x1c3RlcmluZy5jbHVzdGVyQnlIdWJzaXplLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5jbHVzdGVyT3V0bGllcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmNsdXN0ZXJPdXRsaWVycy5hcHBseSh0aGlzLmNsdXN0ZXJpbmcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0U2VlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheW91dEVuZ2luZS5nZXRTZWVkLmFwcGx5KHRoaXMubGF5b3V0RW5naW5lLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmVuYWJsZUVkaXRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFuaXB1bGF0aW9uLmVuYWJsZUVkaXRNb2RlLmFwcGx5KHRoaXMubWFuaXB1bGF0aW9uLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmRpc2FibGVFZGl0TW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbi5kaXNhYmxlRWRpdE1vZGUuYXBwbHkodGhpcy5tYW5pcHVsYXRpb24sYXJndW1lbnRzKX0sby5wcm90b3R5cGUuYWRkTm9kZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYW5pcHVsYXRpb24uYWRkTm9kZU1vZGUuYXBwbHkodGhpcy5tYW5pcHVsYXRpb24sYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZWRpdE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYW5pcHVsYXRpb24uZWRpdE5vZGUuYXBwbHkodGhpcy5tYW5pcHVsYXRpb24sYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZWRpdE5vZGVNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUubG9nKCJEZXByZWNhdGVkOiBQbGVhc2UgdXNlIGVkaXROb2RlIGluc3RlYWQgb2YgZWRpdE5vZGVNb2RlLiIpLHRoaXMubWFuaXB1bGF0aW9uLmVkaXROb2RlLmFwcGx5KHRoaXMubWFuaXB1bGF0aW9uLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmFkZEVkZ2VNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFuaXB1bGF0aW9uLmFkZEVkZ2VNb2RlLmFwcGx5KHRoaXMubWFuaXB1bGF0aW9uLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmVkaXRFZGdlTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbi5lZGl0RWRnZU1vZGUuYXBwbHkodGhpcy5tYW5pcHVsYXRpb24sYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZGVsZXRlU2VsZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYW5pcHVsYXRpb24uZGVsZXRlU2VsZWN0ZWQuYXBwbHkodGhpcy5tYW5pcHVsYXRpb24sYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0UG9zaXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZXNIYW5kbGVyLmdldFBvc2l0aW9ucy5hcHBseSh0aGlzLm5vZGVzSGFuZGxlcixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5zdG9yZVBvc2l0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVzSGFuZGxlci5zdG9yZVBvc2l0aW9ucy5hcHBseSh0aGlzLm5vZGVzSGFuZGxlcixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5tb3ZlTm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVzSGFuZGxlci5tb3ZlTm9kZS5hcHBseSh0aGlzLm5vZGVzSGFuZGxlcixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5nZXRCb3VuZGluZ0JveD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVzSGFuZGxlci5nZXRCb3VuZGluZ0JveC5hcHBseSh0aGlzLm5vZGVzSGFuZGxlcixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5nZXRDb25uZWN0ZWROb2Rlcz1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW3RdP3RoaXMubm9kZXNIYW5kbGVyLmdldENvbm5lY3RlZE5vZGVzLmFwcGx5KHRoaXMubm9kZXNIYW5kbGVyLGFyZ3VtZW50cyk6dGhpcy5lZGdlc0hhbmRsZXIuZ2V0Q29ubmVjdGVkTm9kZXMuYXBwbHkodGhpcy5lZGdlc0hhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0Q29ubmVjdGVkRWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2Rlc0hhbmRsZXIuZ2V0Q29ubmVjdGVkRWRnZXMuYXBwbHkodGhpcy5ub2Rlc0hhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuc3RhcnRTaW11bGF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGh5c2ljcy5zdGFydFNpbXVsYXRpb24uYXBwbHkodGhpcy5waHlzaWNzLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLnN0b3BTaW11bGF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGh5c2ljcy5zdG9wU2ltdWxhdGlvbi5hcHBseSh0aGlzLnBoeXNpY3MsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuc3RhYmlsaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGh5c2ljcy5zdGFiaWxpemUuYXBwbHkodGhpcy5waHlzaWNzLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldFNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0U2VsZWN0aW9uLmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5zZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNldFNlbGVjdGlvbi5hcHBseSh0aGlzLnNlbGVjdGlvbkhhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0U2VsZWN0ZWROb2Rlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0U2VsZWN0ZWROb2Rlcy5hcHBseSh0aGlzLnNlbGVjdGlvbkhhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0U2VsZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0U2VsZWN0ZWRFZGdlcy5hcHBseSh0aGlzLnNlbGVjdGlvbkhhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0Tm9kZUF0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldE5vZGVBdC5hcHBseSh0aGlzLnNlbGVjdGlvbkhhbmRsZXIsYXJndW1lbnRzKTtyZXR1cm4gdm9pZCAwIT09dCYmdm9pZCAwIT09dC5pZD90LmlkOnR9LG8ucHJvdG90eXBlLmdldEVkZ2VBdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRFZGdlQXQuYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyk7cmV0dXJuIHZvaWQgMCE9PXQmJnZvaWQgMCE9PXQuaWQ/dC5pZDp0fSxvLnByb3RvdHlwZS5zZWxlY3ROb2Rlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbkhhbmRsZXIuc2VsZWN0Tm9kZXMuYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLnNlbGVjdEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uSGFuZGxlci5zZWxlY3RFZGdlcy5hcHBseSh0aGlzLnNlbGVjdGlvbkhhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUudW5zZWxlY3RBbGw9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwuYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyksdGhpcy5yZWRyYXcoKX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIucmVkcmF3LmFwcGx5KHRoaXMucmVuZGVyZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3LmdldFNjYWxlLmFwcGx5KHRoaXMudmlldyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5nZXRWaWV3UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3LmdldFZpZXdQb3NpdGlvbi5hcHBseSh0aGlzLnZpZXcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlldy5maXQuYXBwbHkodGhpcy52aWV3LGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcubW92ZVRvLmFwcGx5KHRoaXMudmlldyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5mb2N1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcuZm9jdXMuYXBwbHkodGhpcy52aWV3LGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLnJlbGVhc2VOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlldy5yZWxlYXNlTm9kZS5hcHBseSh0aGlzLnZpZXcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0T3B0aW9uc0Zyb21Db25maWd1cmF0b3I9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gdGhpcy5jb25maWd1cmF0b3ImJih0PXRoaXMuY29uZmlndXJhdG9yLmdldE9wdGlvbnMuYXBwbHkodGhpcy5jb25maWd1cmF0b3IpKSx0fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlKXsidW5kZWZpbmVkIiE9dHlwZW9mIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCYmKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuY2lyY2xlPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmJlZ2luUGF0aCgpLHRoaXMuYXJjKHQsZSxpLDAsMipNYXRoLlBJLCExKSx0aGlzLmNsb3NlUGF0aCgpfSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLnNxdWFyZT1mdW5jdGlvbih0LGUsaSl7dGhpcy5iZWdpblBhdGgoKSx0aGlzLnJlY3QodC1pLGUtaSwyKmksMippKSx0aGlzLmNsb3NlUGF0aCgpfSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLnRyaWFuZ2xlPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmJlZ2luUGF0aCgpLGkqPTEuMTUsZSs9LjI3NSppO3ZhciBvPTIqaSxuPW8vMixzPU1hdGguc3FydCgzKS82Km8scj1NYXRoLnNxcnQobypvLW4qbik7dGhpcy5tb3ZlVG8odCxlLShyLXMpKSx0aGlzLmxpbmVUbyh0K24sZStzKSx0aGlzLmxpbmVUbyh0LW4sZStzKSx0aGlzLmxpbmVUbyh0LGUtKHItcykpLHRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUudHJpYW5nbGVEb3duPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmJlZ2luUGF0aCgpLGkqPTEuMTUsZS09LjI3NSppO3ZhciBvPTIqaSxuPW8vMixzPU1hdGguc3FydCgzKS82Km8scj1NYXRoLnNxcnQobypvLW4qbik7dGhpcy5tb3ZlVG8odCxlKyhyLXMpKSx0aGlzLmxpbmVUbyh0K24sZS1zKSx0aGlzLmxpbmVUbyh0LW4sZS1zKSx0aGlzLmxpbmVUbyh0LGUrKHItcykpLHRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuc3Rhcj1mdW5jdGlvbih0LGUsaSl7dGhpcy5iZWdpblBhdGgoKSxpKj0uODIsZSs9LjEqaTtmb3IodmFyIG89MDtvPDEwO28rKyl7dmFyIG49byUyPT0wPzEuMyppOi41Kmk7dGhpcy5saW5lVG8odCtuKk1hdGguc2luKDIqbypNYXRoLlBJLzEwKSxlLW4qTWF0aC5jb3MoMipvKk1hdGguUEkvMTApKX10aGlzLmNsb3NlUGF0aCgpfSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLmRpYW1vbmQ9ZnVuY3Rpb24odCxlLGkpe3RoaXMuYmVnaW5QYXRoKCksdGhpcy5saW5lVG8odCxlK2kpLHRoaXMubGluZVRvKHQraSxlKSx0aGlzLmxpbmVUbyh0LGUtaSksdGhpcy5saW5lVG8odC1pLGUpLHRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUucm91bmRSZWN0PWZ1bmN0aW9uKHQsZSxpLG8sbil7dmFyIHM9TWF0aC5QSS8xODA7aS0yKm48MCYmKG49aS8yKSxvLTIqbjwwJiYobj1vLzIpLHRoaXMuYmVnaW5QYXRoKCksdGhpcy5tb3ZlVG8odCtuLGUpLHRoaXMubGluZVRvKHQraS1uLGUpLHRoaXMuYXJjKHQraS1uLGUrbixuLDI3MCpzLDM2MCpzLCExKSx0aGlzLmxpbmVUbyh0K2ksZStvLW4pLHRoaXMuYXJjKHQraS1uLGUrby1uLG4sMCw5MCpzLCExKSx0aGlzLmxpbmVUbyh0K24sZStvKSx0aGlzLmFyYyh0K24sZStvLW4sbiw5MCpzLDE4MCpzLCExKSx0aGlzLmxpbmVUbyh0LGUrbiksdGhpcy5hcmModCtuLGUrbixuLDE4MCpzLDI3MCpzLCExKSx0aGlzLmNsb3NlUGF0aCgpfSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLmVsbGlwc2VfdmlzPWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPWkvMiouNTUyMjg0OCxzPW8vMiouNTUyMjg0OCxyPXQraSxhPWUrbyxoPXQraS8yLGQ9ZStvLzI7dGhpcy5iZWdpblBhdGgoKSx0aGlzLm1vdmVUbyh0LGQpLHRoaXMuYmV6aWVyQ3VydmVUbyh0LGQtcyxoLW4sZSxoLGUpLHRoaXMuYmV6aWVyQ3VydmVUbyhoK24sZSxyLGQtcyxyLGQpLHRoaXMuYmV6aWVyQ3VydmVUbyhyLGQrcyxoK24sYSxoLGEpLHRoaXMuYmV6aWVyQ3VydmVUbyhoLW4sYSx0LGQrcyx0LGQpLHRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuZGF0YWJhc2U9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49aSxzPW8qKDEvMykscj1uLzIqLjU1MjI4NDgsYT1zLzIqLjU1MjI4NDgsaD10K24sZD1lK3MsbD10K24vMix1PWUrcy8yLGM9ZSsoby1zLzIpLHA9ZStvO3RoaXMuYmVnaW5QYXRoKCksdGhpcy5tb3ZlVG8oaCx1KSx0aGlzLmJlemllckN1cnZlVG8oaCx1K2EsbCtyLGQsbCxkKSx0aGlzLmJlemllckN1cnZlVG8obC1yLGQsdCx1K2EsdCx1KSx0aGlzLmJlemllckN1cnZlVG8odCx1LWEsbC1yLGUsbCxlKSx0aGlzLmJlemllckN1cnZlVG8obCtyLGUsaCx1LWEsaCx1KSx0aGlzLmxpbmVUbyhoLGMpLHRoaXMuYmV6aWVyQ3VydmVUbyhoLGMrYSxsK3IscCxsLHApLHRoaXMuYmV6aWVyQ3VydmVUbyhsLXIscCx0LGMrYSx0LGMpLHRoaXMubGluZVRvKHQsdSl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuYXJyb3dFbmRwb2ludD1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbj10LW8qTWF0aC5jb3MoaSkscz1lLW8qTWF0aC5zaW4oaSkscj10LS45Km8qTWF0aC5jb3MoaSksYT1lLS45Km8qTWF0aC5zaW4oaSksaD1uK28vMypNYXRoLmNvcyhpKy41Kk1hdGguUEkpLGQ9cytvLzMqTWF0aC5zaW4oaSsuNSpNYXRoLlBJKSxsPW4rby8zKk1hdGguY29zKGktLjUqTWF0aC5QSSksdT1zK28vMypNYXRoLnNpbihpLS41Kk1hdGguUEkpO3RoaXMuYmVnaW5QYXRoKCksdGhpcy5tb3ZlVG8odCxlKSx0aGlzLmxpbmVUbyhoLGQpLHRoaXMubGluZVRvKHIsYSksdGhpcy5saW5lVG8obCx1KSx0aGlzLmNsb3NlUGF0aCgpfSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLmNpcmNsZUVuZHBvaW50PWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPS40Km8scz10LW4qTWF0aC5jb3MoaSkscj1lLW4qTWF0aC5zaW4oaSk7dGhpcy5jaXJjbGUocyxyLG4pfSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLmRhc2hlZExpbmU9ZnVuY3Rpb24odCxlLGksbyxuKXt0aGlzLmJlZ2luUGF0aCgpLHRoaXMubW92ZVRvKHQsZSk7Zm9yKHZhciBzPW4ubGVuZ3RoLHI9aS10LGE9by1lLGg9YS9yLGQ9TWF0aC5zcXJ0KHIqcithKmEpLGw9MCx1PSEwLGM9MCxwPW5bMF07ZD49LjE7KXA9bltsKyslc10scD5kJiYocD1kKSxjPU1hdGguc3FydChwKnAvKDEraCpoKSksYz1yPDA/LWM6Yyx0Kz1jLGUrPWgqYywhMD09PXU/dGhpcy5saW5lVG8odCxlKTp0aGlzLm1vdmVUbyh0LGUpLGQtPXAsdT0hdX0pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gUj10LGYoKX1mdW5jdGlvbiBuKCl7QT0wLHo9Ui5jaGFyQXQoMCl9ZnVuY3Rpb24gcygpe0ErKyx6PVIuY2hhckF0KEEpfWZ1bmN0aW9uIHIoKXtyZXR1cm4gUi5jaGFyQXQoQSsxKX1mdW5jdGlvbiBhKHQpe3JldHVybiBCLnRlc3QodCl9ZnVuY3Rpb24gaCh0LGUpe2lmKHR8fCh0PXt9KSxlKWZvcih2YXIgaSBpbiBlKWUuaGFzT3duUHJvcGVydHkoaSkmJih0W2ldPWVbaV0pO3JldHVybiB0fWZ1bmN0aW9uIGQodCxlLGkpe2Zvcih2YXIgbz1lLnNwbGl0KCIuIiksbj10O28ubGVuZ3RoOyl7dmFyIHM9by5zaGlmdCgpO28ubGVuZ3RoPyhuW3NdfHwobltzXT17fSksbj1uW3NdKTpuW3NdPWl9fWZ1bmN0aW9uIGwodCxlKXtmb3IodmFyIGksbyxuPW51bGwscz1bdF0scj10O3IucGFyZW50OylzLnB1c2goci5wYXJlbnQpLHI9ci5wYXJlbnQ7aWYoci5ub2Rlcylmb3IoaT0wLG89ci5ub2Rlcy5sZW5ndGg7aTxvO2krKylpZihlLmlkPT09ci5ub2Rlc1tpXS5pZCl7bj1yLm5vZGVzW2ldO2JyZWFrfWZvcihufHwobj17aWQ6ZS5pZH0sdC5ub2RlJiYobi5hdHRyPWgobi5hdHRyLHQubm9kZSkpKSxpPXMubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBhPXNbaV07YS5ub2Rlc3x8KGEubm9kZXM9W10pLC0xPT09YS5ub2Rlcy5pbmRleE9mKG4pJiZhLm5vZGVzLnB1c2gobil9ZS5hdHRyJiYobi5hdHRyPWgobi5hdHRyLGUuYXR0cikpfWZ1bmN0aW9uIHUodCxlKXtpZih0LmVkZ2VzfHwodC5lZGdlcz1bXSksdC5lZGdlcy5wdXNoKGUpLHQuZWRnZSl7dmFyIGk9aCh7fSx0LmVkZ2UpO2UuYXR0cj1oKGksZS5hdHRyKX19ZnVuY3Rpb24gYyh0LGUsaSxvLG4pe3ZhciBzPXtmcm9tOmUsdG86aSx0eXBlOm99O3JldHVybiB0LmVkZ2UmJihzLmF0dHI9aCh7fSx0LmVkZ2UpKSxzLmF0dHI9aChzLmF0dHJ8fHt9LG4pLHN9ZnVuY3Rpb24gcCgpe2ZvcihGPUkuTlVMTCxMPSIiOyIgIj09PXp8fCJcdCI9PT16fHwiXG4iPT09enx8IlxyIj09PXo7KXMoKTtkb3t2YXIgdD0hMTtpZigiIyI9PT16KXtmb3IodmFyIGU9QS0xOyIgIj09PVIuY2hhckF0KGUpfHwiXHQiPT09Ui5jaGFyQXQoZSk7KWUtLTtpZigiXG4iPT09Ui5jaGFyQXQoZSl8fCIiPT09Ui5jaGFyQXQoZSkpe2Zvcig7IiIhPXomJiJcbiIhPXo7KXMoKTt0PSEwfX1pZigiLyI9PT16JiYiLyI9PT1yKCkpe2Zvcig7IiIhPXomJiJcbiIhPXo7KXMoKTt0PSEwfWlmKCIvIj09PXomJiIqIj09PXIoKSl7Zm9yKDsiIiE9ejspe2lmKCIqIj09PXomJiIvIj09PXIoKSl7cygpLHMoKTticmVha31zKCl9dD0hMH1mb3IoOyIgIj09PXp8fCJcdCI9PT16fHwiXG4iPT09enx8IlxyIj09PXo7KXMoKX13aGlsZSh0KTtpZigiIj09PXopcmV0dXJuIHZvaWQoRj1JLkRFTElNSVRFUik7dmFyIGk9eityKCk7aWYoTltpXSlyZXR1cm4gRj1JLkRFTElNSVRFUixMPWkscygpLHZvaWQgcygpO2lmKE5bel0pcmV0dXJuIEY9SS5ERUxJTUlURVIsTD16LHZvaWQgcygpO2lmKGEoeil8fCItIj09PXope2ZvcihMKz16LHMoKTthKHopOylMKz16LHMoKTtyZXR1cm4iZmFsc2UiPT09TD9MPSExOiJ0cnVlIj09PUw/TD0hMDppc05hTihOdW1iZXIoTCkpfHwoTD1OdW1iZXIoTCkpLHZvaWQoRj1JLklERU5USUZJRVIpfWlmKCciJz09PXope2ZvcihzKCk7IiIhPXomJignIichPXp8fCciJz09PXomJiciJz09PXIoKSk7KUwrPXosJyInPT09eiYmcygpLHMoKTtpZignIichPXopdGhyb3cgeCgnRW5kIG9mIHN0cmluZyAiIGV4cGVjdGVkJyk7cmV0dXJuIHMoKSx2b2lkKEY9SS5JREVOVElGSUVSKX1mb3IoRj1JLlVOS05PV047IiIhPXo7KUwrPXoscygpCjt0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N5bnRheCBlcnJvciBpbiBwYXJ0ICInK2soTCwzMCkrJyInKX1mdW5jdGlvbiBmKCl7dmFyIHQ9e307aWYobigpLHAoKSwic3RyaWN0Ij09PUwmJih0LnN0cmljdD0hMCxwKCkpLCJncmFwaCIhPT1MJiYiZGlncmFwaCIhPT1MfHwodC50eXBlPUwscCgpKSxGPT09SS5JREVOVElGSUVSJiYodC5pZD1MLHAoKSksInsiIT1MKXRocm93IHgoIkFuZ2xlIGJyYWNrZXQgeyBleHBlY3RlZCIpO2lmKHAoKSxtKHQpLCJ9IiE9TCl0aHJvdyB4KCJBbmdsZSBicmFja2V0IH0gZXhwZWN0ZWQiKTtpZihwKCksIiIhPT1MKXRocm93IHgoIkVuZCBvZiBmaWxlIGV4cGVjdGVkIik7cmV0dXJuIHAoKSxkZWxldGUgdC5ub2RlLGRlbGV0ZSB0LmVkZ2UsZGVsZXRlIHQuZ3JhcGgsdH1mdW5jdGlvbiBtKHQpe2Zvcig7IiIhPT1MJiYifSIhPUw7KXYodCksIjsiPT09TCYmcCgpfWZ1bmN0aW9uIHYodCl7dmFyIGU9Zyh0KTtpZihlKXJldHVybiB2b2lkIF8odCxlKTtpZigheSh0KSl7aWYoRiE9SS5JREVOVElGSUVSKXRocm93IHgoIklkZW50aWZpZXIgZXhwZWN0ZWQiKTt2YXIgaT1MO2lmKHAoKSwiPSI9PT1MKXtpZihwKCksRiE9SS5JREVOVElGSUVSKXRocm93IHgoIklkZW50aWZpZXIgZXhwZWN0ZWQiKTt0W2ldPUwscCgpfWVsc2UgYih0LGkpfX1mdW5jdGlvbiBnKHQpe3ZhciBlPW51bGw7aWYoInN1YmdyYXBoIj09PUwmJihlPXt9LGUudHlwZT0ic3ViZ3JhcGgiLHAoKSxGPT09SS5JREVOVElGSUVSJiYoZS5pZD1MLHAoKSkpLCJ7Ij09PUwpe2lmKHAoKSxlfHwoZT17fSksZS5wYXJlbnQ9dCxlLm5vZGU9dC5ub2RlLGUuZWRnZT10LmVkZ2UsZS5ncmFwaD10LmdyYXBoLG0oZSksIn0iIT1MKXRocm93IHgoIkFuZ2xlIGJyYWNrZXQgfSBleHBlY3RlZCIpO3AoKSxkZWxldGUgZS5ub2RlLGRlbGV0ZSBlLmVkZ2UsZGVsZXRlIGUuZ3JhcGgsZGVsZXRlIGUucGFyZW50LHQuc3ViZ3JhcGhzfHwodC5zdWJncmFwaHM9W10pLHQuc3ViZ3JhcGhzLnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24geSh0KXtyZXR1cm4ibm9kZSI9PT1MPyhwKCksdC5ub2RlPXcoKSwibm9kZSIpOiJlZGdlIj09PUw/KHAoKSx0LmVkZ2U9dygpLCJlZGdlIik6ImdyYXBoIj09PUw/KHAoKSx0LmdyYXBoPXcoKSwiZ3JhcGgiKTpudWxsfWZ1bmN0aW9uIGIodCxlKXt2YXIgaT17aWQ6ZX0sbz13KCk7byYmKGkuYXR0cj1vKSxsKHQsaSksXyh0LGUpfWZ1bmN0aW9uIF8odCxlKXtmb3IoOyItPiI9PT1MfHwiLS0iPT09TDspe3ZhciBpLG89TDtwKCk7dmFyIG49Zyh0KTtpZihuKWk9bjtlbHNle2lmKEYhPUkuSURFTlRJRklFUil0aHJvdyB4KCJJZGVudGlmaWVyIG9yIHN1YmdyYXBoIGV4cGVjdGVkIik7aT1MLGwodCx7aWQ6aX0pLHAoKX11KHQsYyh0LGUsaSxvLHcoKSkpLGU9aX19ZnVuY3Rpb24gdygpe2Zvcih2YXIgdD1udWxsOyJbIj09PUw7KXtmb3IocCgpLHQ9e307IiIhPT1MJiYiXSIhPUw7KXtpZihGIT1JLklERU5USUZJRVIpdGhyb3cgeCgiQXR0cmlidXRlIG5hbWUgZXhwZWN0ZWQiKTt2YXIgZT1MO2lmKHAoKSwiPSIhPUwpdGhyb3cgeCgiRXF1YWwgc2lnbiA9IGV4cGVjdGVkIik7aWYocCgpLEYhPUkuSURFTlRJRklFUil0aHJvdyB4KCJBdHRyaWJ1dGUgdmFsdWUgZXhwZWN0ZWQiKTtkKHQsZSxMKSxwKCksIiwiPT1MJiZwKCl9aWYoIl0iIT1MKXRocm93IHgoIkJyYWNrZXQgXSBleHBlY3RlZCIpO3AoKX1yZXR1cm4gdH1mdW5jdGlvbiB4KHQpe3JldHVybiBuZXcgU3ludGF4RXJyb3IodCsnLCBnb3QgIicrayhMLDMwKSsnIiAoY2hhciAnK0ErIikiKX1mdW5jdGlvbiBrKHQsZSl7cmV0dXJuIHQubGVuZ3RoPD1lP3Q6dC5zdWJzdHIoMCwyNykrIi4uLiJ9ZnVuY3Rpb24gTSh0LGUsaSl7QXJyYXkuaXNBcnJheSh0KT90LmZvckVhY2goZnVuY3Rpb24odCl7QXJyYXkuaXNBcnJheShlKT9lLmZvckVhY2goZnVuY3Rpb24oZSl7aSh0LGUpfSk6aSh0LGUpfSk6QXJyYXkuaXNBcnJheShlKT9lLmZvckVhY2goZnVuY3Rpb24oZSl7aSh0LGUpfSk6aSh0LGUpfWZ1bmN0aW9uIFModCxlLGkpe2Zvcih2YXIgbz1lLnNwbGl0KCIuIiksbj1vLnBvcCgpLHM9dCxyPTA7cjxvLmxlbmd0aDtyKyspe3ZhciBhPW9bcl07YSBpbiBzfHwoc1thXT17fSkscz1zW2FdfXJldHVybiBzW25dPWksdH1mdW5jdGlvbiBEKHQsZSl7dmFyIGk9e307Zm9yKHZhciBvIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShvKSl7dmFyIG49ZVtvXTtBcnJheS5pc0FycmF5KG4pP24uZm9yRWFjaChmdW5jdGlvbihlKXtTKGksZSx0W29dKX0pOiJzdHJpbmciPT10eXBlb2Ygbj9TKGksbix0W29dKTpTKGksbyx0W29dKX1yZXR1cm4gaX1mdW5jdGlvbiBPKHQpe3ZhciBlPW8odCksaT17bm9kZXM6W10sZWRnZXM6W10sb3B0aW9uczp7fX07aWYoZS5ub2RlcyYmZS5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXtpZDp0LmlkLGxhYmVsOlN0cmluZyh0LmxhYmVsfHx0LmlkKX07aChlLEQodC5hdHRyLEUpKSxlLmltYWdlJiYoZS5zaGFwZT0iaW1hZ2UiKSxpLm5vZGVzLnB1c2goZSl9KSxlLmVkZ2VzKXt2YXIgbj1mdW5jdGlvbih0KXt2YXIgZT17ZnJvbTp0LmZyb20sdG86dC50b307cmV0dXJuIGgoZSxEKHQuYXR0cixQKSksZS5hcnJvd3M9Ii0+Ij09PXQudHlwZT8idG8iOnZvaWQgMCxlfTtlLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGUsbztlPXQuZnJvbSBpbnN0YW5jZW9mIE9iamVjdD90LmZyb20ubm9kZXM6e2lkOnQuZnJvbX0sbz10LnRvIGluc3RhbmNlb2YgT2JqZWN0P3QudG8ubm9kZXM6e2lkOnQudG99LHQuZnJvbSBpbnN0YW5jZW9mIE9iamVjdCYmdC5mcm9tLmVkZ2VzJiZ0LmZyb20uZWRnZXMuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1uKHQpO2kuZWRnZXMucHVzaChlKX0pLE0oZSxvLGZ1bmN0aW9uKGUsbyl7dmFyIHM9YyhpLGUuaWQsby5pZCx0LnR5cGUsdC5hdHRyKSxyPW4ocyk7aS5lZGdlcy5wdXNoKHIpfSksdC50byBpbnN0YW5jZW9mIE9iamVjdCYmdC50by5lZGdlcyYmdC50by5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPW4odCk7aS5lZGdlcy5wdXNoKGUpfSl9KX1yZXR1cm4gZS5hdHRyJiYoaS5vcHRpb25zPWUuYXR0ciksaX12YXIgQz1pKDU1KSxUPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0oQyksRT17Zm9udHNpemU6ImZvbnQuc2l6ZSIsZm9udGNvbG9yOiJmb250LmNvbG9yIixsYWJlbGZvbnRjb2xvcjoiZm9udC5jb2xvciIsZm9udG5hbWU6ImZvbnQuZmFjZSIsY29sb3I6WyJjb2xvci5ib3JkZXIiLCJjb2xvci5iYWNrZ3JvdW5kIl0sZmlsbGNvbG9yOiJjb2xvci5iYWNrZ3JvdW5kIix0b29sdGlwOiJ0aXRsZSIsbGFiZWx0b29sdGlwOiJ0aXRsZSJ9LFA9KDAsVC5kZWZhdWx0KShFKTtQLmNvbG9yPSJjb2xvci5jb2xvciI7dmFyIEk9e05VTEw6MCxERUxJTUlURVI6MSxJREVOVElGSUVSOjIsVU5LTk9XTjozfSxOPXsieyI6ITAsIn0iOiEwLCJbIjohMCwiXSI6ITAsIjsiOiEwLCI9IjohMCwiLCI6ITAsIi0+IjohMCwiLS0iOiEwfSxSPSIiLEE9MCx6PSIiLEw9IiIsRj1JLk5VTEwsQj0vW2EtekEtWl8wLTkuOiNdLztlLnBhcnNlRE9UPW8sZS5ET1RUb0dyYXBoPU99LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0LGUpe3ZhciBpPVtdLG89W10sbj17ZWRnZXM6e2luaGVyaXRDb2xvcjohMX0sbm9kZXM6e2ZpeGVkOiExLHBhcnNlQ29sb3I6ITF9fTt2b2lkIDAhPT1lJiYodm9pZCAwIT09ZS5maXhlZCYmKG4ubm9kZXMuZml4ZWQ9ZS5maXhlZCksdm9pZCAwIT09ZS5wYXJzZUNvbG9yJiYobi5ub2Rlcy5wYXJzZUNvbG9yPWUucGFyc2VDb2xvciksdm9pZCAwIT09ZS5pbmhlcml0Q29sb3ImJihuLmVkZ2VzLmluaGVyaXRDb2xvcj1lLmluaGVyaXRDb2xvcikpO2Zvcih2YXIgcz10LmVkZ2VzLHI9dC5ub2RlcyxhPTA7YTxzLmxlbmd0aDthKyspe3ZhciBoPXt9LGQ9c1thXTtoLmlkPWQuaWQsaC5mcm9tPWQuc291cmNlLGgudG89ZC50YXJnZXQsaC5hdHRyaWJ1dGVzPWQuYXR0cmlidXRlcyxoLmxhYmVsPWQubGFiZWwsaC50aXRsZT12b2lkIDAhPT1kLmF0dHJpYnV0ZXM/ZC5hdHRyaWJ1dGVzLnRpdGxlOnZvaWQgMCwiRGlyZWN0ZWQiPT09ZC50eXBlJiYoaC5hcnJvd3M9InRvIiksZC5jb2xvciYmITE9PT1uLmluaGVyaXRDb2xvciYmKGguY29sb3I9ZC5jb2xvciksaS5wdXNoKGgpfWZvcih2YXIgYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgbD17fSx1PXJbYV07bC5pZD11LmlkLGwuYXR0cmlidXRlcz11LmF0dHJpYnV0ZXMsbC54PXUueCxsLnk9dS55LGwubGFiZWw9dS5sYWJlbCxsLnRpdGxlPXZvaWQgMCE9PXUuYXR0cmlidXRlcz91LmF0dHJpYnV0ZXMudGl0bGU6dS50aXRsZSwhMD09PW4ubm9kZXMucGFyc2VDb2xvcj9sLmNvbG9yPXUuY29sb3I6bC5jb2xvcj12b2lkIDAhPT11LmNvbG9yP3tiYWNrZ3JvdW5kOnUuY29sb3IsYm9yZGVyOnUuY29sb3IsaGlnaGxpZ2h0OntiYWNrZ3JvdW5kOnUuY29sb3IsYm9yZGVyOnUuY29sb3J9LGhvdmVyOntiYWNrZ3JvdW5kOnUuY29sb3IsYm9yZGVyOnUuY29sb3J9fTp2b2lkIDAsbC5zaXplPXUuc2l6ZSxsLmZpeGVkPW4ubm9kZXMuZml4ZWQmJnZvaWQgMCE9PXUueCYmdm9pZCAwIT09dS55LG8ucHVzaChsKX1yZXR1cm57bm9kZXM6byxlZGdlczppfX1lLnBhcnNlR2VwaGk9aX0sZnVuY3Rpb24odCxlKXtlLmVuPXtlZGl0OiJFZGl0IixkZWw6IkRlbGV0ZSBzZWxlY3RlZCIsYmFjazoiQmFjayIsYWRkTm9kZToiQWRkIE5vZGUiLGFkZEVkZ2U6IkFkZCBFZGdlIixlZGl0Tm9kZToiRWRpdCBOb2RlIixlZGl0RWRnZToiRWRpdCBFZGdlIixhZGREZXNjcmlwdGlvbjoiQ2xpY2sgaW4gYW4gZW1wdHkgc3BhY2UgdG8gcGxhY2UgYSBuZXcgbm9kZS4iLGVkZ2VEZXNjcmlwdGlvbjoiQ2xpY2sgb24gYSBub2RlIGFuZCBkcmFnIHRoZSBlZGdlIHRvIGFub3RoZXIgbm9kZSB0byBjb25uZWN0IHRoZW0uIixlZGl0RWRnZURlc2NyaXB0aW9uOiJDbGljayBvbiB0aGUgY29udHJvbCBwb2ludHMgYW5kIGRyYWcgdGhlbSB0byBhIG5vZGUgdG8gY29ubmVjdCB0byBpdC4iLGNyZWF0ZUVkZ2VFcnJvcjoiQ2Fubm90IGxpbmsgZWRnZXMgdG8gYSBjbHVzdGVyLiIsZGVsZXRlQ2x1c3RlckVycm9yOiJDbHVzdGVycyBjYW5ub3QgYmUgZGVsZXRlZC4iLGVkaXRDbHVzdGVyRXJyb3I6IkNsdXN0ZXJzIGNhbm5vdCBiZSBlZGl0ZWQuIn0sZS5lbl9FTj1lLmVuLGUuZW5fVVM9ZS5lbixlLmRlPXtlZGl0OiJFZGl0aWVyZW4iLGRlbDoiTMO2c2NoZSBBdXN3YWhsIixiYWNrOiJadXLDvGNrIixhZGROb2RlOiJLbm90ZW4gaGluenVmw7xnZW4iLGFkZEVkZ2U6IkthbnRlIGhpbnp1ZsO8Z2VuIixlZGl0Tm9kZToiS25vdGVuIGVkaXRpZXJlbiIsZWRpdEVkZ2U6IkthbnRlIGVkaXRpZXJlbiIsYWRkRGVzY3JpcHRpb246IktsaWNrZSBhdWYgZWluZSBmcmVpZSBTdGVsbGUsIHVtIGVpbmVuIG5ldWVuIEtub3RlbiB6dSBwbGF6aWVyZW4uIixlZGdlRGVzY3JpcHRpb246IktsaWNrZSBhdWYgZWluZW4gS25vdGVuIHVuZCB6aWVoZSBkaWUgS2FudGUgenUgZWluZW0gYW5kZXJlbiBLbm90ZW4sIHVtIGRpZXNlIHp1IHZlcmJpbmRlbi4iLGVkaXRFZGdlRGVzY3JpcHRpb246IktsaWNrZSBhdWYgZGllIFZlcmJpbmR1bmdzcHVua3RlIHVuZCB6aWVoZSBkaWVzZSBhdWYgZWluZW4gS25vdGVuLCB1bSBzaWUgenUgdmVyYmluZGVuLiIsY3JlYXRlRWRnZUVycm9yOiJFcyBpc3QgbmljaHQgbcO2Z2xpY2gsIEthbnRlbiBtaXQgQ2x1c3Rlcm4genUgdmVyYmluZGVuLiIsZGVsZXRlQ2x1c3RlckVycm9yOiJDbHVzdGVyIGvDtm5uZW4gbmljaHQgZ2Vsw7ZzY2h0IHdlcmRlbi4iLGVkaXRDbHVzdGVyRXJyb3I6IkNsdXN0ZXIga8O2bm5lbiBuaWNodCBlZGl0aWVydCB3ZXJkZW4uIn0sZS5kZV9ERT1lLmRlLGUuZXM9e2VkaXQ6IkVkaXRhciIsZGVsOiJFbGltaW5hciBzZWxlY2Npw7NuIixiYWNrOiLDgXRyYXMiLGFkZE5vZGU6IkHDsWFkaXIgbm9kbyIsYWRkRWRnZToiQcOxYWRpciBhcmlzdGEiLGVkaXROb2RlOiJFZGl0YXIgbm9kbyIsZWRpdEVkZ2U6IkVkaXRhciBhcmlzdGEiLGFkZERlc2NyaXB0aW9uOiJIYWdhIGNsaWMgZW4gdW4gbHVnYXIgdmFjw61vIHBhcmEgY29sb2NhciB1biBudWV2byBub2RvLiIsZWRnZURlc2NyaXB0aW9uOiJIYWdhIGNsaWMgZW4gdW4gbm9kbyB5IGFycmFzdHJlIGxhIGFyaXN0YSBoYWNpYSBvdHJvIG5vZG8gcGFyYSBjb25lY3Rhcmxvcy4iLGVkaXRFZGdlRGVzY3JpcHRpb246IkhhZ2EgY2xpYyBlbiB1biBwdW50byBkZSBjb250cm9sIHkgYXJyYXN0cmVsbyBhIHVuIG5vZG8gcGFyYSBjb25lY3RhcmxvLiIsY3JlYXRlRWRnZUVycm9yOiJObyBzZSBwdWVkZSBjb25lY3RhciB1bmEgYXJpc3RhIGEgdW4gZ3J1cG8uIixkZWxldGVDbHVzdGVyRXJyb3I6Ik5vIGVzIHBvc2libGUgZWxpbWluYXIgZ3J1cG9zLiIsZWRpdENsdXN0ZXJFcnJvcjoiTm8gZXMgcG9zaWJsZSBlZGl0YXIgZ3J1cG9zLiJ9LGUuZXNfRVM9ZS5lcyxlLml0PXtlZGl0OiJNb2RpZmljYSIsZGVsOiJDYW5jZWxsYSBsYSBzZWxlemlvbmUiLGJhY2s6IkluZGlldHJvIixhZGROb2RlOiJBZ2dpdW5naSB1biBub2RvIixhZGRFZGdlOiJBZ2dpdW5naSB1biB2ZXJ0aWNlIixlZGl0Tm9kZToiTW9kaWZpY2EgaWwgbm9kbyIsZWRpdEVkZ2U6Ik1vZGlmaWNhIGlsIHZlcnRpY2UiLGFkZERlc2NyaXB0aW9uOiJDbGljY2EgcGVyIGFnZ2l1bmdlcmUgdW4gbnVvdm8gbm9kbyIsZWRnZURlc2NyaXB0aW9uOiJDbGljY2Egc3UgdW4gbm9kbyBlIHRyYXNjaW5hbG8gYWQgdW4gYWx0cm8gbm9kbyBwZXIgY29ubmV0dGVybGkuIixlZGl0RWRnZURlc2NyaXB0aW9uOiJDbGljY2Egc3VpIFB1bnRpIGRpIGNvbnRyb2xsbyBlIHRyYXNjaW5hbGkgYWQgdW4gbm9kbyBwZXIgY29ubmV0dGVybGkuIixjcmVhdGVFZGdlRXJyb3I6Ik5vbiBzaSBwb3Nzb25vIGNvbGxlZ2FyZSB2ZXJ0aWNpIGFkIHVuIGNsdXN0ZXIiLGRlbGV0ZUNsdXN0ZXJFcnJvcjoiSSBjbHVzdGVyIG5vbiBwb3Nzb25vIGVzc2VyZSBjYW5jZWxsYXRpIixlZGl0Q2x1c3RlckVycm9yOiJJIGNsdXN0ZXJzIG5vbiBwb3Nzb25vIGVzc2VyZSBtb2RpZmljYXRpLiJ9LGUuaXRfSVQ9ZS5pdCxlLm5sPXtlZGl0OiJXaWp6aWdlbiIsZGVsOiJTZWxlY3RpZSB2ZXJ3aWpkZXJlbiIsYmFjazoiVGVydWciLGFkZE5vZGU6Ik5vZGUgdG9ldm9lZ2VuIixhZGRFZGdlOiJMaW5rIHRvZXZvZWdlbiIsZWRpdE5vZGU6Ik5vZGUgd2lqemlnZW4iLGVkaXRFZGdlOiJMaW5rIHdpanppZ2VuIixhZGREZXNjcmlwdGlvbjoiS2xpayBvcCBlZW4gbGVlZyBnZWJpZWQgb20gZWVuIG5pZXV3ZSBub2RlIHRlIG1ha2VuLiIsZWRnZURlc2NyaXB0aW9uOiJLbGlrIG9wIGVlbiBub2RlIGVuIHNsZWVwIGRlIGxpbmsgbmFhciBlZW4gYW5kZXJlIG5vZGUgb20gemUgdGUgdmVyYmluZGVuLiIsZWRpdEVkZ2VEZXNjcmlwdGlvbjoiS2xpayBvcCBkZSB2ZXJiaW5kaW5nc3B1bnRlbiBlbiBzbGVlcCB6ZSBuYWFyIGVlbiBub2RlIG9tIGRhYXJtZWUgdGUgdmVyYmluZGVuLiIsY3JlYXRlRWRnZUVycm9yOiJLYW4gZ2VlbiBsaW5rIG1ha2VuIG5hYXIgZWVuIGNsdXN0ZXIuIixkZWxldGVDbHVzdGVyRXJyb3I6IkNsdXN0ZXJzIGt1bm5lbiBuaWV0IHdvcmRlbiB2ZXJ3aWpkZXJkLiIsZWRpdENsdXN0ZXJFcnJvcjoiQ2x1c3RlcnMga3VubmVuIG5pZXQgd29yZGVuIGFhbmdlcGFzdC4ifSxlLm5sX05MPWUubmwsZS5ubF9CRT1lLm5sLGVbInB0LWJyIl09e2VkaXQ6IkVkaXRhciIsZGVsOiJSZW1vdmVyIHNlbGVjaW9uYWRvIixiYWNrOiJWb2x0YXIiLGFkZE5vZGU6IkFkaWNpb25hciBuw7MiLGFkZEVkZ2U6IkFkaWNpb25hciBhcmVzdGEiLGVkaXROb2RlOiJFZGl0YXIgbsOzIixlZGl0RWRnZToiRWRpdGFyIGFyZXN0YSIsYWRkRGVzY3JpcHRpb246IkNsaXF1ZSBlbSB1bSBlc3Bhw6dvIGVtIGJyYW5jbyBwYXJhIGFkaWNpb25hciB1bSBub3ZvIG7DsyIsZWRnZURlc2NyaXB0aW9uOiJDbGlxdWUgZW0gdW0gbsOzIGUgYXJyYXN0ZSBhIGFyZXN0YSBhdMOpIG91dHJvIG7DsyBwYXJhIGNvbmVjdMOhLWxvcyIsZWRpdEVkZ2VEZXNjcmlwdGlvbjoiQ2xpcXVlIG5vcyBwb250b3MgZGUgY29udHJvbGUgZSBvcyBhcnJhc3RlIHBhcmEgdW0gbsOzIHBhcmEgY29uZWN0w6EtbG9zIixjcmVhdGVFZGdlRXJyb3I6Ik7Do28gZm9pIHBvc3PDrXZlbCBsaW5rYXIgYXJlc3RhcyBhIHVtIGNsdXN0ZXIuIixkZWxldGVDbHVzdGVyRXJyb3I6IkNsdXN0ZXJzIG7Do28gcHVkZXJhbSBzZXIgcmVtb3ZpZG9zLiIsZWRpdENsdXN0ZXJFcnJvcjoiQ2x1c3RlcnMgbsOjbyBwdWRlcmFtIHNlciBlZGl0YWRvcy4ifSxlWyJwdC1CUiJdPWVbInB0LWJyIl0sZS5wdF9CUj1lWyJwdC1iciJdLGUucHRfYnI9ZVsicHQtYnIiXSxlLnJ1PXtlZGl0OiLQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCIsZGVsOiLQo9C00LDQu9C40YLRjCDQstGL0LHRgNCw0L3QvdC+0LUiLGJhY2s6ItCd0LDQt9Cw0LQiLGFkZE5vZGU6ItCU0L7QsdCw0LLQuNGC0Ywg0YPQt9C10LsiLGFkZEVkZ2U6ItCU0L7QsdCw0LLQuNGC0Ywg0YDQtdCx0YDQviIsZWRpdE5vZGU6ItCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINGD0LfQtdC7IixlZGl0RWRnZToi0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0YDQtdCx0YDQviIsYWRkRGVzY3JpcHRpb246ItCa0LvQuNC60L3QuNGC0LUg0LIg0YHQstC+0LHQvtC00L3QvtC1INC80LXRgdGC0L4sINGH0YLQvtCx0Ysg0LTQvtCx0LDQstC40YLRjCDQvdC+0LLRi9C5INGD0LfQtdC7LiIsZWRnZURlc2NyaXB0aW9uOiLQmtC70LjQutC90LjRgtC1INC90LAg0YPQt9C10Lsg0Lgg0L/RgNC+0YLRj9C90LjRgtC1INGA0LXQsdGA0L4g0Log0LTRgNGD0LPQvtC80YMg0YPQt9C70YMsINGH0YLQvtCx0Ysg0YHQvtC10LTQuNC90LjRgtGMINC40YUuIixlZGl0RWRnZURlc2NyaXB0aW9uOiLQmtC70LjQutC90LjRgtC1INC90LAg0LrQvtC90YLRgNC+0LvRjNC90YvQtSDRgtC+0YfQutC4INC4INC/0LXRgNC10YLQsNGJ0LjRgtC1INC40YUg0LIg0YPQt9C10LssINGH0YLQvtCx0Ysg0L/QvtC00LrQu9GO0YfQuNGC0YzRgdGPINC6INC90LXQvNGDLiIsY3JlYXRlRWRnZUVycm9yOiLQndC10LLQvtC30LzQvtC20L3QviDRgdC+0LXQtNC40L3QuNGC0Ywg0YDQtdCx0YDQsCDQsiDQutC70LDRgdGC0LXRgC4iLGRlbGV0ZUNsdXN0ZXJFcnJvcjoi0JrQu9Cw0YHRgtC10YDRiyDQvdC1INC80L7Qs9GD0YIg0LHRi9GC0Ywg0YPQtNCw0LvQtdC90YsiLGVkaXRDbHVzdGVyRXJyb3I6ItCa0LvQsNGB0YLQtdGA0Ysg0L3QtdC00L7RgdGC0YPQv9C90Ysg0LTQu9GPINGA0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40Y8uIn0sZS5ydV9SVT1lLnJ1fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTM0KSxzPW8obikscj1pKDEzNSksYT1vKHIpLGg9aSgxNjUpLGQ9byhoKSxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5pbWFnZXM9e30sdGhpcy5pbWFnZUJyb2tlbj17fSx0aGlzLmNhbGxiYWNrPWV9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OiJfdHJ5bG9hZEJyb2tlblVybCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2lmKHZvaWQgMCE9PXQmJnZvaWQgMCE9PWkpe2lmKHZvaWQgMD09PWUpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJObyBicm9rZW4gdXJsIGltYWdlIGRlZmluZWQiKTtpLm9uZXJyb3I9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgbG9hZCBicm9rZW5JbWFnZToiLGUpfSxpLmltYWdlLnNyYz1lfX19LHtrZXk6Il9yZWRyYXdXaXRoSW1hZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuY2FsbGJhY2smJnRoaXMuY2FsbGJhY2sodCl9fSx7a2V5OiJsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89dGhpcyxuPXRoaXMuaW1hZ2VzW3RdO2lmKG4pcmV0dXJuIG47dmFyIHM9bmV3IGQuZGVmYXVsdDtyZXR1cm4gdGhpcy5pbWFnZXNbdF09cyxzLmltYWdlLm9ubG9hZD1mdW5jdGlvbigpe28uX2ZpeEltYWdlQ29vcmRpbmF0ZXMocy5pbWFnZSkscy5pbml0KCksby5fcmVkcmF3V2l0aEltYWdlKHMpfSxzLmltYWdlLm9uZXJyb3I9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgbG9hZCBpbWFnZToiLHQpLG8uX3RyeWxvYWRCcm9rZW5VcmwodCxlLHMpfSxzLmltYWdlLnNyYz10LHN9fSx7a2V5OiJfZml4SW1hZ2VDb29yZGluYXRlcyIsdmFsdWU6ZnVuY3Rpb24odCl7MD09PXQud2lkdGgmJihkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpLHQud2lkdGg9dC5vZmZzZXRXaWR0aCx0LmhlaWdodD10Lm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHQpKX19XSksdH0oKTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDEzNCkscz1vKG4pLHI9aSgxMzUpLGE9byhyKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5OVU1fSVRFUkFUSU9OUz00LHRoaXMuaW1hZ2U9bmV3IEltYWdlLHRoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5pbml0aWFsaXplZCgpKXt2YXIgdD10aGlzLmltYWdlLndpZHRoLGU9dGhpcy5pbWFnZS5oZWlnaHQ7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWUsdGhpcy5jYW52YXMud2lkdGg9Myp0LzQsdGhpcy5jYW52YXMuaGVpZ2h0PWUvMix0aGlzLmNvb3JkaW5hdGVzPVtbMCwwLHQvMixlLzJdLFt0LzIsMCx0LzQsZS80XSxbdC8yLGUvNCx0LzgsZS84XSxbNSp0LzgsZS80LHQvMTYsZS8xNl1dLHRoaXMuX2ZpbGxNaXBNYXAoKX19fSx7a2V5OiJpbml0aWFsaXplZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5jb29yZGluYXRlc319LHtrZXk6Il9maWxsTWlwTWFwIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIiksZT10aGlzLmNvb3JkaW5hdGVzWzBdO3QuZHJhd0ltYWdlKHRoaXMuaW1hZ2UsZVswXSxlWzFdLGVbMl0sZVszXSk7Zm9yKHZhciBpPTE7aTx0aGlzLk5VTV9JVEVSQVRJT05TO2krKyl7dmFyIG89dGhpcy5jb29yZGluYXRlc1tpLTFdLG49dGhpcy5jb29yZGluYXRlc1tpXTt0LmRyYXdJbWFnZSh0aGlzLmNhbnZhcyxvWzBdLG9bMV0sb1syXSxvWzNdLG5bMF0sblsxXSxuWzJdLG5bM10pfX19LHtrZXk6ImRyYXdJbWFnZUF0UG9zaXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXtpZihlPjImJnRoaXMuaW5pdGlhbGl6ZWQoKSl7ZSo9LjU7Zm9yKHZhciByPTA7ZT4yJiZyPHRoaXMuTlVNX0lURVJBVElPTlM7KWUqPS41LHIrPTE7cj49dGhpcy5OVU1fSVRFUkFUSU9OUyYmKHI9dGhpcy5OVU1fSVRFUkFUSU9OUy0xKTt2YXIgYT10aGlzLmNvb3JkaW5hdGVzW3JdO3QuZHJhd0ltYWdlKHRoaXMuY2FudmFzLGFbMF0sYVsxXSxhWzJdLGFbM10saSxvLG4scyl9ZWxzZSB0aGlzLl9pc0ltYWdlT2soKSYmdC5kcmF3SW1hZ2UodGhpcy5pbWFnZSxpLG8sbixzKX19LHtrZXk6Il9pc0ltYWdlT2siLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciB0PXRoaXMuaW1hZ2U7cmV0dXJuISF0LmNvbXBsZXRlJiYodm9pZCAwPT09dC5uYXR1cmFsV2lkdGh8fDAhPT10Lm5hdHVyYWxXaWR0aCl9fV0pLHR9KCk7ZS5kZWZhdWx0PWh9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxMzQpLHM9byhuKSxyPWkoMTM1KSxhPW8ociksaD1pKDEpLGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuY2xlYXIoKSx0aGlzLmRlZmF1bHRJbmRleD0wLHRoaXMuZ3JvdXBzQXJyYXk9W10sdGhpcy5ncm91cEluZGV4PTAsdGhpcy5kZWZhdWx0R3JvdXBzPVt7Ym9yZGVyOiIjMkI3Q0U5IixiYWNrZ3JvdW5kOiIjOTdDMkZDIixoaWdobGlnaHQ6e2JvcmRlcjoiIzJCN0NFOSIsYmFja2dyb3VuZDoiI0QyRTVGRiJ9LGhvdmVyOntib3JkZXI6IiMyQjdDRTkiLGJhY2tncm91bmQ6IiNEMkU1RkYifX0se2JvcmRlcjoiI0ZGQTUwMCIsYmFja2dyb3VuZDoiI0ZGRkYwMCIsaGlnaGxpZ2h0Ontib3JkZXI6IiNGRkE1MDAiLGJhY2tncm91bmQ6IiNGRkZGQTMifSxob3Zlcjp7Ym9yZGVyOiIjRkZBNTAwIixiYWNrZ3JvdW5kOiIjRkZGRkEzIn19LHtib3JkZXI6IiNGQTBBMTAiLGJhY2tncm91bmQ6IiNGQjdFODEiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjRkEwQTEwIixiYWNrZ3JvdW5kOiIjRkZBRkIxIn0saG92ZXI6e2JvcmRlcjoiI0ZBMEExMCIsYmFja2dyb3VuZDoiI0ZGQUZCMSJ9fSx7Ym9yZGVyOiIjNDFBOTA2IixiYWNrZ3JvdW5kOiIjN0JFMTQxIixoaWdobGlnaHQ6e2JvcmRlcjoiIzQxQTkwNiIsYmFja2dyb3VuZDoiI0ExRUM3NiJ9LGhvdmVyOntib3JkZXI6IiM0MUE5MDYiLGJhY2tncm91bmQ6IiNBMUVDNzYifX0se2JvcmRlcjoiI0UxMjlGMCIsYmFja2dyb3VuZDoiI0VCN0RGNCIsaGlnaGxpZ2h0Ontib3JkZXI6IiNFMTI5RjAiLGJhY2tncm91bmQ6IiNGMEIzRjUifSxob3Zlcjp7Ym9yZGVyOiIjRTEyOUYwIixiYWNrZ3JvdW5kOiIjRjBCM0Y1In19LHtib3JkZXI6IiM3QzI5RjAiLGJhY2tncm91bmQ6IiNBRDg1RTQiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjN0MyOUYwIixiYWNrZ3JvdW5kOiIjRDNCREYwIn0saG92ZXI6e2JvcmRlcjoiIzdDMjlGMCIsYmFja2dyb3VuZDoiI0QzQkRGMCJ9fSx7Ym9yZGVyOiIjQzM3RjAwIixiYWNrZ3JvdW5kOiIjRkZBODA3IixoaWdobGlnaHQ6e2JvcmRlcjoiI0MzN0YwMCIsYmFja2dyb3VuZDoiI0ZGQ0E2NiJ9LGhvdmVyOntib3JkZXI6IiNDMzdGMDAiLGJhY2tncm91bmQ6IiNGRkNBNjYifX0se2JvcmRlcjoiIzQyMjBGQiIsYmFja2dyb3VuZDoiIzZFNkVGRCIsaGlnaGxpZ2h0Ontib3JkZXI6IiM0MjIwRkIiLGJhY2tncm91bmQ6IiM5QjlCRkQifSxob3Zlcjp7Ym9yZGVyOiIjNDIyMEZCIixiYWNrZ3JvdW5kOiIjOUI5QkZEIn19LHtib3JkZXI6IiNGRDVBNzciLGJhY2tncm91bmQ6IiNGRkMwQ0IiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjRkQ1QTc3IixiYWNrZ3JvdW5kOiIjRkZEMUQ5In0saG92ZXI6e2JvcmRlcjoiI0ZENUE3NyIsYmFja2dyb3VuZDoiI0ZGRDFEOSJ9fSx7Ym9yZGVyOiIjNEFENjNBIixiYWNrZ3JvdW5kOiIjQzJGQUJDIixoaWdobGlnaHQ6e2JvcmRlcjoiIzRBRDYzQSIsYmFja2dyb3VuZDoiI0U2RkZFMyJ9LGhvdmVyOntib3JkZXI6IiM0QUQ2M0EiLGJhY2tncm91bmQ6IiNFNkZGRTMifX0se2JvcmRlcjoiIzk5MDAwMCIsYmFja2dyb3VuZDoiI0VFMDAwMCIsaGlnaGxpZ2h0Ontib3JkZXI6IiNCQjAwMDAiLGJhY2tncm91bmQ6IiNGRjMzMzMifSxob3Zlcjp7Ym9yZGVyOiIjQkIwMDAwIixiYWNrZ3JvdW5kOiIjRkYzMzMzIn19LHtib3JkZXI6IiNGRjYwMDAiLGJhY2tncm91bmQ6IiNGRjYwMDAiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjRkY2MDAwIixiYWNrZ3JvdW5kOiIjRkY2MDAwIn0saG92ZXI6e2JvcmRlcjoiI0ZGNjAwMCIsYmFja2dyb3VuZDoiI0ZGNjAwMCJ9fSx7Ym9yZGVyOiIjOTdDMkZDIixiYWNrZ3JvdW5kOiIjMkI3Q0U5IixoaWdobGlnaHQ6e2JvcmRlcjoiI0QyRTVGRiIsYmFja2dyb3VuZDoiIzJCN0NFOSJ9LGhvdmVyOntib3JkZXI6IiNEMkU1RkYiLGJhY2tncm91bmQ6IiMyQjdDRTkifX0se2JvcmRlcjoiIzM5OTYwNSIsYmFja2dyb3VuZDoiIzI1NUMwMyIsaGlnaGxpZ2h0Ontib3JkZXI6IiMzOTk2MDUiLGJhY2tncm91bmQ6IiMyNTVDMDMifSxob3Zlcjp7Ym9yZGVyOiIjMzk5NjA1IixiYWNrZ3JvdW5kOiIjMjU1QzAzIn19LHtib3JkZXI6IiNCNzAwNTQiLGJhY2tncm91bmQ6IiNGRjAwN0UiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjQjcwMDU0IixiYWNrZ3JvdW5kOiIjRkYwMDdFIn0saG92ZXI6e2JvcmRlcjoiI0I3MDA1NCIsYmFja2dyb3VuZDoiI0ZGMDA3RSJ9fSx7Ym9yZGVyOiIjQUQ4NUU0IixiYWNrZ3JvdW5kOiIjN0MyOUYwIixoaWdobGlnaHQ6e2JvcmRlcjoiI0QzQkRGMCIsYmFja2dyb3VuZDoiIzdDMjlGMCJ9LGhvdmVyOntib3JkZXI6IiNEM0JERjAiLGJhY2tncm91bmQ6IiM3QzI5RjAifX0se2JvcmRlcjoiIzQ1NTdGQSIsYmFja2dyb3VuZDoiIzAwMEVBMSIsaGlnaGxpZ2h0Ontib3JkZXI6IiM2RTZFRkQiLGJhY2tncm91bmQ6IiMwMDBFQTEifSxob3Zlcjp7Ym9yZGVyOiIjNkU2RUZEIixiYWNrZ3JvdW5kOiIjMDAwRUExIn19LHtib3JkZXI6IiNGRkMwQ0IiLGJhY2tncm91bmQ6IiNGRDVBNzciLGhpZ2hsaWdodDp7Ym9yZGVyOiIjRkZEMUQ5IixiYWNrZ3JvdW5kOiIjRkQ1QTc3In0saG92ZXI6e2JvcmRlcjoiI0ZGRDFEOSIsYmFja2dyb3VuZDoiI0ZENUE3NyJ9fSx7Ym9yZGVyOiIjQzJGQUJDIixiYWNrZ3JvdW5kOiIjNzRENjZBIixoaWdobGlnaHQ6e2JvcmRlcjoiI0U2RkZFMyIsYmFja2dyb3VuZDoiIzc0RDY2QSJ9LGhvdmVyOntib3JkZXI6IiNFNkZGRTMiLGJhY2tncm91bmQ6IiM3NEQ2NkEifX0se2JvcmRlcjoiI0VFMDAwMCIsYmFja2dyb3VuZDoiIzk5MDAwMCIsaGlnaGxpZ2h0Ontib3JkZXI6IiNGRjMzMzMiLGJhY2tncm91bmQ6IiNCQjAwMDAifSxob3Zlcjp7Ym9yZGVyOiIjRkYzMzMzIixiYWNrZ3JvdW5kOiIjQkIwMDAwIn19XSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17dXNlRGVmYXVsdEdyb3VwczohMH0saC5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9WyJ1c2VEZWZhdWx0R3JvdXBzIl07aWYodm9pZCAwIT09dClmb3IodmFyIGkgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGkpJiYtMT09PWUuaW5kZXhPZihpKSl7dmFyIG89dFtpXTt0aGlzLmFkZChpLG8pfX19LHtrZXk6ImNsZWFyIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZ3JvdXBzPXt9LHRoaXMuZ3JvdXBzQXJyYXk9W119fSx7a2V5OiJnZXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JvdXBzW3RdO2lmKHZvaWQgMD09PWUpaWYoITE9PT10aGlzLm9wdGlvbnMudXNlRGVmYXVsdEdyb3VwcyYmdGhpcy5ncm91cHNBcnJheS5sZW5ndGg+MCl7dmFyIGk9dGhpcy5ncm91cEluZGV4JXRoaXMuZ3JvdXBzQXJyYXkubGVuZ3RoO3RoaXMuZ3JvdXBJbmRleCsrLGU9e30sZS5jb2xvcj10aGlzLmdyb3Vwc1t0aGlzLmdyb3Vwc0FycmF5W2ldXSx0aGlzLmdyb3Vwc1t0XT1lfWVsc2V7dmFyIG89dGhpcy5kZWZhdWx0SW5kZXgldGhpcy5kZWZhdWx0R3JvdXBzLmxlbmd0aDt0aGlzLmRlZmF1bHRJbmRleCsrLGU9e30sZS5jb2xvcj10aGlzLmRlZmF1bHRHcm91cHNbb10sdGhpcy5ncm91cHNbdF09ZX1yZXR1cm4gZX19LHtrZXk6ImFkZCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5ncm91cHNbdF09ZSx0aGlzLmdyb3Vwc0FycmF5LnB1c2godCksZX19XSksdH0oKTtlLmRlZmF1bHQ9ZH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDEzNCkscz1vKG4pLHI9aSgxMzUpLGE9byhyKSxoPWkoMSksZD1pKDg5KSxsPWkoOTMpLHU9aSgxNjgpLmRlZmF1bHQsYz1pKDE2OSkuZGVmYXVsdCxwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyxuKXt2YXIgcj10aGlzOygwLHMuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLmltYWdlcz1pLHRoaXMuZ3JvdXBzPW8sdGhpcy5sYXlvdXRFbmdpbmU9bix0aGlzLmJvZHkuZnVuY3Rpb25zLmNyZWF0ZU5vZGU9dGhpcy5jcmVhdGUuYmluZCh0aGlzKSx0aGlzLm5vZGVzTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlKXtyLmFkZChlLml0ZW1zKX0sdXBkYXRlOmZ1bmN0aW9uKHQsZSl7ci51cGRhdGUoZS5pdGVtcyxlLmRhdGEpfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXtyLnJlbW92ZShlLml0ZW1zKX19LHRoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXtib3JkZXJXaWR0aDoxLGJvcmRlcldpZHRoU2VsZWN0ZWQ6Mixicm9rZW5JbWFnZTp2b2lkIDAsY29sb3I6e2JvcmRlcjoiIzJCN0NFOSIsYmFja2dyb3VuZDoiIzk3QzJGQyIsaGlnaGxpZ2h0Ontib3JkZXI6IiMyQjdDRTkiLGJhY2tncm91bmQ6IiNEMkU1RkYifSxob3Zlcjp7Ym9yZGVyOiIjMkI3Q0U5IixiYWNrZ3JvdW5kOiIjRDJFNUZGIn19LGZpeGVkOnt4OiExLHk6ITF9LGZvbnQ6e2NvbG9yOiIjMzQzNDM0IixzaXplOjE0LGZhY2U6ImFyaWFsIixiYWNrZ3JvdW5kOiJub25lIixzdHJva2VXaWR0aDowLHN0cm9rZUNvbG9yOiIjZmZmZmZmIixhbGlnbjoiY2VudGVyIix2YWRqdXN0OjAsbXVsdGk6ITEsYm9sZDp7bW9kOiJib2xkIn0sYm9sZGl0YWw6e21vZDoiYm9sZCBpdGFsaWMifSxpdGFsOnttb2Q6Iml0YWxpYyJ9LG1vbm86e21vZDoiIixzaXplOjE1LGZhY2U6Im1vbm9zcGFjZSIsdmFkanVzdDoyfX0sZ3JvdXA6dm9pZCAwLGhpZGRlbjohMSxpY29uOntmYWNlOiJGb250QXdlc29tZSIsY29kZTp2b2lkIDAsc2l6ZTo1MCxjb2xvcjoiIzJCN0NFOSJ9LGltYWdlOnZvaWQgMCxsYWJlbDp2b2lkIDAsbGFiZWxIaWdobGlnaHRCb2xkOiEwLGxldmVsOnZvaWQgMCxtYXJnaW46e3RvcDo1LHJpZ2h0OjUsYm90dG9tOjUsbGVmdDo1fSxtYXNzOjEscGh5c2ljczohMCxzY2FsaW5nOnttaW46MTAsbWF4OjMwLGxhYmVsOntlbmFibGVkOiExLG1pbjoxNCxtYXg6MzAsbWF4VmlzaWJsZTozMCxkcmF3VGhyZXNob2xkOjV9LGN1c3RvbVNjYWxpbmdGdW5jdGlvbjpmdW5jdGlvbih0LGUsaSxvKXtpZihlPT09dClyZXR1cm4uNTt2YXIgbj0xLyhlLXQpO3JldHVybiBNYXRoLm1heCgwLChvLXQpKm4pfX0sc2hhZG93OntlbmFibGVkOiExLGNvbG9yOiJyZ2JhKDAsMCwwLDAuNSkiLHNpemU6MTAseDo1LHk6NX0sc2hhcGU6ImVsbGlwc2UiLHNoYXBlUHJvcGVydGllczp7Ym9yZGVyRGFzaGVzOiExLGJvcmRlclJhZGl1czo2LGludGVycG9sYXRpb246ITAsdXNlSW1hZ2VTaXplOiExLHVzZUJvcmRlcldpdGhJbWFnZTohMX0sc2l6ZToyNSx0aXRsZTp2b2lkIDAsdmFsdWU6dm9pZCAwLHg6dm9pZCAwLHk6dm9pZCAwfSxoLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5iaW5kRXZlbnRMaXN0ZW5lcnMoKX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6ImJpbmRFdmVudExpc3RlbmVycyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKCJyZWZyZXNoTm9kZXMiLHRoaXMucmVmcmVzaC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbigicmVmcmVzaCIsdGhpcy5yZWZyZXNoLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJkZXN0cm95IixmdW5jdGlvbigpe2guZm9yRWFjaCh0Lm5vZGVzTGlzdGVuZXJzLGZ1bmN0aW9uKGUsaSl7dC5ib2R5LmRhdGEubm9kZXMmJnQuYm9keS5kYXRhLm5vZGVzLm9mZihpLGUpfSksZGVsZXRlIHQuYm9keS5mdW5jdGlvbnMuY3JlYXRlTm9kZSxkZWxldGUgdC5ub2Rlc0xpc3RlbmVycy5hZGQsZGVsZXRlIHQubm9kZXNMaXN0ZW5lcnMudXBkYXRlLGRlbGV0ZSB0Lm5vZGVzTGlzdGVuZXJzLnJlbW92ZSxkZWxldGUgdC5ub2Rlc0xpc3RlbmVyc30pfX0se2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5ub2RlT3B0aW9ucz10LHZvaWQgMCE9PXQpe2lmKHUucGFyc2VPcHRpb25zKHRoaXMub3B0aW9ucyx0KSx2b2lkIDAhPT10LnNoYXBlKWZvcih2YXIgZSBpbiB0aGlzLmJvZHkubm9kZXMpdGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGUpJiZ0aGlzLmJvZHkubm9kZXNbZV0udXBkYXRlU2hhcGUoKTtpZih2b2lkIDAhPT10LmZvbnQpe2MucGFyc2VPcHRpb25zKHRoaXMub3B0aW9ucy5mb250LHQpO2Zvcih2YXIgaSBpbiB0aGlzLmJvZHkubm9kZXMpdGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGkpJiYodGhpcy5ib2R5Lm5vZGVzW2ldLnVwZGF0ZUxhYmVsTW9kdWxlKCksdGhpcy5ib2R5Lm5vZGVzW2ldLm5lZWRzUmVmcmVzaCgpKX1pZih2b2lkIDAhPT10LnNpemUpZm9yKHZhciBvIGluIHRoaXMuYm9keS5ub2Rlcyl0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkobykmJnRoaXMuYm9keS5ub2Rlc1tvXS5uZWVkc1JlZnJlc2goKTt2b2lkIDA9PT10LmhpZGRlbiYmdm9pZCAwPT09dC5waHlzaWNzfHx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfZGF0YUNoYW5nZWQiKX19fSx7a2V5OiJzZXREYXRhIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGk9dGhpcy5ib2R5LmRhdGEubm9kZXM7aWYodCBpbnN0YW5jZW9mIGR8fHQgaW5zdGFuY2VvZiBsKXRoaXMuYm9keS5kYXRhLm5vZGVzPXQ7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXRoaXMuYm9keS5kYXRhLm5vZGVzPW5ldyBkLHRoaXMuYm9keS5kYXRhLm5vZGVzLmFkZCh0KTtlbHNle2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgb3IgRGF0YVNldCBleHBlY3RlZCIpO3RoaXMuYm9keS5kYXRhLm5vZGVzPW5ldyBkfWlmKGkmJmguZm9yRWFjaCh0aGlzLm5vZGVzTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7aS5vZmYoZSx0KX0pLHRoaXMuYm9keS5ub2Rlcz17fSx0aGlzLmJvZHkuZGF0YS5ub2Rlcyl7dmFyIG89dGhpcztoLmZvckVhY2godGhpcy5ub2Rlc0xpc3RlbmVycyxmdW5jdGlvbih0LGUpe28uYm9keS5kYXRhLm5vZGVzLm9uKGUsdCl9KTt2YXIgbj10aGlzLmJvZHkuZGF0YS5ub2Rlcy5nZXRJZHMoKTt0aGlzLmFkZChuLCEwKX0hMT09PWUmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToiYWRkIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxpPXZvaWQgMCxvPVtdLG49MDtuPHQubGVuZ3RoO24rKyl7aT10W25dO3ZhciBzPXRoaXMuYm9keS5kYXRhLm5vZGVzLmdldChpKSxyPXRoaXMuY3JlYXRlKHMpO28ucHVzaChyKSx0aGlzLmJvZHkubm9kZXNbaV09cn10aGlzLmxheW91dEVuZ2luZS5wb3NpdGlvbkluaXRpYWxseShvKSwhMT09PWUmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToidXBkYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLmJvZHkubm9kZXMsbz0hMSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl0scj1pW3NdLGE9ZVtuXTt2b2lkIDAhPT1yP289ci5zZXRPcHRpb25zKGEpOihvPSEwLHI9dGhpcy5jcmVhdGUoYSksaVtzXT1yKX0hMD09PW8/dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIik6dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFVcGRhdGVkIil9fSx7a2V5OiJyZW1vdmUiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmJvZHkubm9kZXMsaT0wO2k8dC5sZW5ndGg7aSsrKXtkZWxldGUgZVt0W2ldXX10aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfZGF0YUNoYW5nZWQiKX19LHtrZXk6ImNyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyhhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dSkodCx0aGlzLmJvZHksdGhpcy5pbWFnZXMsdGhpcy5ncm91cHMsdGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMsdGhpcy5ub2RlT3B0aW9ucyl9fSx7a2V5OiJyZWZyZXNoIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF0sZT10aGlzLmJvZHkubm9kZXM7Zm9yKHZhciBpIGluIGUpe3ZhciBvPXZvaWQgMDtlLmhhc093blByb3BlcnR5KGkpJiYobz1lW2ldKTt2YXIgbj10aGlzLmJvZHkuZGF0YS5ub2Rlcy5nZXQoaSk7dm9pZCAwIT09byYmdm9pZCAwIT09biYmKCEwPT09dCYmby5zZXRPcHRpb25zKHt4Om51bGwseTpudWxsfSksby5zZXRPcHRpb25zKHtmaXhlZDohMX0pLG8uc2V0T3B0aW9ucyhuKSl9fX0se2tleToiZ2V0UG9zaXRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT17fTtpZih2b2lkIDAhPT10KXtpZighMD09PUFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWlmKHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0W2ldXSl7dmFyIG89dGhpcy5ib2R5Lm5vZGVzW3RbaV1dO2VbdFtpXV09e3g6TWF0aC5yb3VuZChvLngpLHk6TWF0aC5yb3VuZChvLnkpfX19ZWxzZSBpZih2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0pe3ZhciBuPXRoaXMuYm9keS5ub2Rlc1t0XTtlW3RdPXt4Ok1hdGgucm91bmQobi54KSx5Ok1hdGgucm91bmQobi55KX19fWVsc2UgZm9yKHZhciBzPTA7czx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO3MrKyl7dmFyIHI9dGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tzXV07ZVt0aGlzLmJvZHkubm9kZUluZGljZXNbc11dPXt4Ok1hdGgucm91bmQoci54KSx5Ok1hdGgucm91bmQoci55KX19cmV0dXJuIGV9fSx7a2V5OiJzdG9yZVBvc2l0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPXRoaXMuYm9keS5kYXRhLm5vZGVzLmdldERhdGFTZXQoKTtmb3IodmFyIGkgaW4gZS5fZGF0YSlpZihlLl9kYXRhLmhhc093blByb3BlcnR5KGkpKXt2YXIgbz10aGlzLmJvZHkubm9kZXNbaV07ZS5fZGF0YVtpXS54PT1NYXRoLnJvdW5kKG8ueCkmJmUuX2RhdGFbaV0ueT09TWF0aC5yb3VuZChvLnkpfHx0LnB1c2goe2lkOm8uaWQseDpNYXRoLnJvdW5kKG8ueCkseTpNYXRoLnJvdW5kKG8ueSl9KX1lLnVwZGF0ZSh0KX19LHtrZXk6ImdldEJvdW5kaW5nQm94Iix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0pcmV0dXJuIHRoaXMuYm9keS5ub2Rlc1t0XS5zaGFwZS5ib3VuZGluZ0JveH19LHtrZXk6ImdldENvbm5lY3RlZE5vZGVzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXTtpZih2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0pZm9yKHZhciBpPXRoaXMuYm9keS5ub2Rlc1t0XSxvPXt9LG49MDtuPGkuZWRnZXMubGVuZ3RoO24rKyl7dmFyIHM9aS5lZGdlc1tuXTtzLnRvSWQ9PWkuaWQ/dm9pZCAwPT09b1tzLmZyb21JZF0mJihlLnB1c2gocy5mcm9tSWQpLG9bcy5mcm9tSWRdPSEwKTpzLmZyb21JZD09aS5pZCYmdm9pZCAwPT09b1tzLnRvSWRdJiYoZS5wdXNoKHMudG9JZCksb1tzLnRvSWRdPSEwKX1yZXR1cm4gZX19LHtrZXk6ImdldENvbm5lY3RlZEVkZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXTtpZih2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0pZm9yKHZhciBpPXRoaXMuYm9keS5ub2Rlc1t0XSxvPTA7bzxpLmVkZ2VzLmxlbmd0aDtvKyspZS5wdXNoKGkuZWRnZXNbb10uaWQpO2Vsc2UgY29uc29sZS5sb2coIk5vZGVJZCBwcm92aWRlZCBmb3IgZ2V0Q29ubmVjdGVkRWRnZXMgZG9lcyBub3QgZXhpc3QuIFByb3ZpZGVkOiAiLHQpO3JldHVybiBlfX0se2tleToibW92ZU5vZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10aGlzO3ZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0XT8odGhpcy5ib2R5Lm5vZGVzW3RdLng9TnVtYmVyKGUpLHRoaXMuYm9keS5ub2Rlc1t0XS55PU51bWJlcihpKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5ib2R5LmVtaXR0ZXIuZW1pdCgic3RhcnRTaW11bGF0aW9uIil9LDApKTpjb25zb2xlLmxvZygiTm9kZSBpZCBzdXBwbGllZCB0byBtb3ZlTm9kZSBkb2VzIG5vdCBleGlzdC4gUHJvdmlkZWQ6ICIsdCl9fV0pLHR9KCk7ZS5kZWZhdWx0PXB9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSg2Mikscz1vKG4pLHI9aSgxMzQpLGE9byhyKSxoPWkoMTM1KSxkPW8oaCksbD1pKDEpLHU9aSgxNjkpLmRlZmF1bHQsYz1pKDE3NCkuZGVmYXVsdCxwPWkoMTg1KS5kZWZhdWx0LGY9aSgxODcpLmRlZmF1bHQsbT1pKDE4OCkuZGVmYXVsdCx2PWkoMTg5KS5kZWZhdWx0LGc9aSgxOTEpLmRlZmF1bHQseT1pKDE5MikuZGVmYXVsdCxiPWkoMTkzKS5kZWZhdWx0LF89aSgxOTQpLmRlZmF1bHQsdz1pKDE5NSkuZGVmYXVsdCx4PWkoMTk2KS5kZWZhdWx0LGs9aSgxOTcpLmRlZmF1bHQsTT1pKDE5OCkuZGVmYXVsdCxTPWkoMTk5KS5kZWZhdWx0LEQ9KGkoMTQ0KS5kZWZhdWx0LGkoMTQ0KSksTz0oRC5wcmludFN0eWxlLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyxuLHMscixoKXsoMCxhLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5vcHRpb25zPWwuYnJpZGdlT2JqZWN0KHMpLHRoaXMuZ2xvYmFsT3B0aW9ucz1zLHRoaXMuZGVmYXVsdE9wdGlvbnM9cix0aGlzLm5vZGVPcHRpb25zPWgsdGhpcy5ib2R5PWksdGhpcy5lZGdlcz1bXSx0aGlzLmlkPXZvaWQgMCx0aGlzLmltYWdlbGlzdD1vLHRoaXMuZ3JvdXBsaXN0PW4sdGhpcy54PXZvaWQgMCx0aGlzLnk9dm9pZCAwLHRoaXMuYmFzZVNpemU9dGhpcy5vcHRpb25zLnNpemUsdGhpcy5iYXNlRm9udFNpemU9dGhpcy5vcHRpb25zLmZvbnQuc2l6ZSx0aGlzLnByZWRlZmluZWRQb3NpdGlvbj0hMSx0aGlzLnNlbGVjdGVkPSExLHRoaXMuaG92ZXI9ITEsdGhpcy5sYWJlbE1vZHVsZT1uZXcgdSh0aGlzLmJvZHksdGhpcy5vcHRpb25zLCExKSx0aGlzLnNldE9wdGlvbnMoZSl9cmV0dXJuKDAsZC5kZWZhdWx0KSh0LFt7a2V5OiJhdHRhY2hFZGdlIix2YWx1ZTpmdW5jdGlvbih0KXstMT09PXRoaXMuZWRnZXMuaW5kZXhPZih0KSYmdGhpcy5lZGdlcy5wdXNoKHQpfX0se2tleToiZGV0YWNoRWRnZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lZGdlcy5pbmRleE9mKHQpOy0xIT1lJiZ0aGlzLmVkZ2VzLnNwbGljZShlLDEpfX0se2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5vcHRpb25zLnNoYXBlO2lmKGUpe2lmKHZvaWQgMCE9PWUuaWQmJih0aGlzLmlkPWUuaWQpLHZvaWQgMD09PXRoaXMuaWQpdGhyb3ciTm9kZSBtdXN0IGhhdmUgYW4gaWQiO2lmKHZvaWQgMCE9PWUueCYmKG51bGw9PT1lLng/KHRoaXMueD12b2lkIDAsdGhpcy5wcmVkZWZpbmVkUG9zaXRpb249ITEpOih0aGlzLng9cGFyc2VJbnQoZS54KSx0aGlzLnByZWRlZmluZWRQb3NpdGlvbj0hMCkpLHZvaWQgMCE9PWUueSYmKG51bGw9PT1lLnk/KHRoaXMueT12b2lkIDAsdGhpcy5wcmVkZWZpbmVkUG9zaXRpb249ITEpOih0aGlzLnk9cGFyc2VJbnQoZS55KSx0aGlzLnByZWRlZmluZWRQb3NpdGlvbj0hMCkpLHZvaWQgMCE9PWUuc2l6ZSYmKHRoaXMuYmFzZVNpemU9ZS5zaXplKSx2b2lkIDAhPT1lLnZhbHVlJiYoZS52YWx1ZT1wYXJzZUZsb2F0KGUudmFsdWUpKSwibnVtYmVyIj09dHlwZW9mIGUuZ3JvdXB8fCJzdHJpbmciPT10eXBlb2YgZS5ncm91cCYmIiIhPWUuZ3JvdXApe3ZhciBvPXRoaXMuZ3JvdXBsaXN0LmdldChlLmdyb3VwKTtsLmRlZXBFeHRlbmQodGhpcy5vcHRpb25zLG8pLHRoaXMub3B0aW9ucy5jb2xvcj1sLnBhcnNlQ29sb3IodGhpcy5vcHRpb25zLmNvbG9yKX1yZXR1cm4gdC5wYXJzZU9wdGlvbnModGhpcy5vcHRpb25zLGUsITAsdGhpcy5nbG9iYWxPcHRpb25zKSx0aGlzLmNob29zaWZ5KGUpLHRoaXMuX2xvYWRfaW1hZ2VzKCksdGhpcy51cGRhdGVMYWJlbE1vZHVsZShlKSx0aGlzLnVwZGF0ZVNoYXBlKGkpLHRoaXMubGFiZWxNb2R1bGUucHJvcGFnYXRlRm9udHModGhpcy5ub2RlT3B0aW9ucyxlLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHZvaWQgMCE9PWUuaGlkZGVufHx2b2lkIDAhPT1lLnBoeXNpY3N9fX0se2tleToiX2xvYWRfaW1hZ2VzIix2YWx1ZTpmdW5jdGlvbigpe2lmKCJjaXJjdWxhckltYWdlIj09PXRoaXMub3B0aW9ucy5zaGFwZXx8ImltYWdlIj09PXRoaXMub3B0aW9ucy5zaGFwZSl7aWYodm9pZCAwPT09dGhpcy5vcHRpb25zLmltYWdlKXRocm93Ik9wdGlvbiBpbWFnZSBtdXN0IGJlIGRlZmluZWQgZm9yIG5vZGUgdHlwZSAnIit0aGlzLm9wdGlvbnMuc2hhcGUrIiciO2lmKHZvaWQgMD09PXRoaXMuaW1hZ2VsaXN0KXRocm93IkludGVybmFsIEVycm9yOiBObyBpbWFnZXMgcHJvdmlkZWQiO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5vcHRpb25zLmltYWdlKXRoaXMuaW1hZ2VPYmo9dGhpcy5pbWFnZWxpc3QubG9hZCh0aGlzLm9wdGlvbnMuaW1hZ2UsdGhpcy5vcHRpb25zLmJyb2tlbkltYWdlLHRoaXMuaWQpO2Vsc2V7aWYodm9pZCAwPT09dGhpcy5vcHRpb25zLmltYWdlLnVuc2VsZWN0ZWQpdGhyb3ciTm8gdW5zZWxlY3RlZCBpbWFnZSBwcm92aWRlZCI7dGhpcy5pbWFnZU9iaj10aGlzLmltYWdlbGlzdC5sb2FkKHRoaXMub3B0aW9ucy5pbWFnZS51bnNlbGVjdGVkLHRoaXMub3B0aW9ucy5icm9rZW5JbWFnZSx0aGlzLmlkKSx2b2lkIDAhPT10aGlzLm9wdGlvbnMuaW1hZ2Uuc2VsZWN0ZWQ/dGhpcy5pbWFnZU9iakFsdD10aGlzLmltYWdlbGlzdC5sb2FkKHRoaXMub3B0aW9ucy5pbWFnZS5zZWxlY3RlZCx0aGlzLm9wdGlvbnMuYnJva2VuSW1hZ2UsdGhpcy5pZCk6dGhpcy5pbWFnZU9iakFsdD12b2lkIDB9fX19LHtrZXk6ImNob29zaWZ5Iix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmNob29zZXI9ITA7dmFyIGU9W3QsdGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnNdLGk9bC50b3BNb3N0KGUsImNob3NlbiIpO2lmKCJib29sZWFuIj09dHlwZW9mIGkpdGhpcy5jaG9vc2VyPWk7ZWxzZSBpZigib2JqZWN0Ij09PSh2b2lkIDA9PT1pPyJ1bmRlZmluZWQiOigwLHMuZGVmYXVsdCkoaSkpKXt2YXIgbz1sLnRvcE1vc3QoZSxbImNob3NlbiIsIm5vZGUiXSk7ImJvb2xlYW4iIT10eXBlb2YgbyYmImZ1bmN0aW9uIiE9dHlwZW9mIG98fCh0aGlzLmNob29zZXI9byl9fX0se2tleToiZ2V0Rm9ybWF0dGluZ1ZhbHVlcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD17Y29sb3I6dGhpcy5vcHRpb25zLmNvbG9yLmJhY2tncm91bmQsYm9yZGVyV2lkdGg6dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoLGJvcmRlckNvbG9yOnRoaXMub3B0aW9ucy5jb2xvci5ib3JkZXIsc2l6ZTp0aGlzLm9wdGlvbnMuc2l6ZSxib3JkZXJEYXNoZXM6dGhpcy5vcHRpb25zLnNoYXBlUHJvcGVydGllcy5ib3JkZXJEYXNoZXMsYm9yZGVyUmFkaXVzOnRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMuYm9yZGVyUmFkaXVzLHNoYWRvdzp0aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWQsc2hhZG93Q29sb3I6dGhpcy5vcHRpb25zLnNoYWRvdy5jb2xvcixzaGFkb3dTaXplOnRoaXMub3B0aW9ucy5zaGFkb3cuc2l6ZSxzaGFkb3dYOnRoaXMub3B0aW9ucy5zaGFkb3cueCxzaGFkb3dZOnRoaXMub3B0aW9ucy5zaGFkb3cueX07cmV0dXJuIHRoaXMuc2VsZWN0ZWR8fHRoaXMuaG92ZXI/ITA9PT10aGlzLmNob29zZXI/dGhpcy5zZWxlY3RlZD8odC5ib3JkZXJXaWR0aCo9Mix0LmNvbG9yPXRoaXMub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYmFja2dyb3VuZCx0LmJvcmRlckNvbG9yPXRoaXMub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYm9yZGVyLHQuc2hhZG93PXRoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZCk6dGhpcy5ob3ZlciYmKHQuY29sb3I9dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJhY2tncm91bmQsdC5ib3JkZXJDb2xvcj10aGlzLm9wdGlvbnMuY29sb3IuaG92ZXIuYm9yZGVyLHQuc2hhZG93PXRoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZCk6ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuY2hvb3NlciYmKHRoaXMuY2hvb3Nlcih0LHRoaXMub3B0aW9ucy5pZCx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIpLCExPT09dC5zaGFkb3cmJih0LnNoYWRvd0NvbG9yPT09dGhpcy5vcHRpb25zLnNoYWRvdy5jb2xvciYmdC5zaGFkb3dTaXplPT09dGhpcy5vcHRpb25zLnNoYWRvdy5zaXplJiZ0LnNoYWRvd1g9PT10aGlzLm9wdGlvbnMuc2hhZG93LngmJnQuc2hhZG93WT09PXRoaXMub3B0aW9ucy5zaGFkb3cueXx8KHQuc2hhZG93PSEwKSkpOnQuc2hhZG93PXRoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZCx0fX0se2tleToidXBkYXRlTGFiZWxNb2R1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXRoaXMub3B0aW9ucy5sYWJlbCYmbnVsbCE9PXRoaXMub3B0aW9ucy5sYWJlbHx8KHRoaXMub3B0aW9ucy5sYWJlbD0iIiksdGhpcy5sYWJlbE1vZHVsZS5zZXRPcHRpb25zKHRoaXMub3B0aW9ucywhMCksdm9pZCAwIT09dGhpcy5sYWJlbE1vZHVsZS5iYXNlU2l6ZSYmKHRoaXMuYmFzZUZvbnRTaXplPXRoaXMubGFiZWxNb2R1bGUuYmFzZVNpemUpLHRoaXMubGFiZWxNb2R1bGUuY29uc3RyYWluKHRoaXMubm9kZU9wdGlvbnMsdCx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmxhYmVsTW9kdWxlLmNob29zaWZ5KHRoaXMubm9kZU9wdGlvbnMsdCx0aGlzLmRlZmF1bHRPcHRpb25zKX19LHtrZXk6InVwZGF0ZVNoYXBlIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0PT09dGhpcy5vcHRpb25zLnNoYXBlJiZ0aGlzLnNoYXBlKXRoaXMuc2hhcGUuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMsdGhpcy5pbWFnZU9iaix0aGlzLmltYWdlT2JqQWx0KTtlbHNlIHN3aXRjaCh0aGlzLm9wdGlvbnMuc2hhcGUpe2Nhc2UiYm94Ijp0aGlzLnNoYXBlPW5ldyBjKHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZSJjaXJjbGUiOnRoaXMuc2hhcGU9bmV3IHAodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTticmVhaztjYXNlImNpcmN1bGFySW1hZ2UiOnRoaXMuc2hhcGU9bmV3IGYodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlLHRoaXMuaW1hZ2VPYmosdGhpcy5pbWFnZU9iakFsdCk7YnJlYWs7Y2FzZSJkYXRhYmFzZSI6dGhpcy5zaGFwZT1uZXcgbSh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2UiZGlhbW9uZCI6dGhpcy5zaGFwZT1uZXcgdih0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2UiZG90Ijp0aGlzLnNoYXBlPW5ldyBnKHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZSJlbGxpcHNlIjp0aGlzLnNoYXBlPW5ldyB5KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZSJpY29uIjp0aGlzLnNoYXBlPW5ldyBiKHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZSJpbWFnZSI6dGhpcy5zaGFwZT1uZXcgXyh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUsdGhpcy5pbWFnZU9iaix0aGlzLmltYWdlT2JqQWx0KTticmVhaztjYXNlInNxdWFyZSI6dGhpcy5zaGFwZT1uZXcgdyh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2Uic3RhciI6dGhpcy5zaGFwZT1uZXcgeCh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2UidGV4dCI6dGhpcy5zaGFwZT1uZXcgayh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2UidHJpYW5nbGUiOnRoaXMuc2hhcGU9bmV3IE0odGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTticmVhaztjYXNlInRyaWFuZ2xlRG93biI6dGhpcy5zaGFwZT1uZXcgUyh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2RlZmF1bHQ6dGhpcy5zaGFwZT1uZXcgeSh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpfXRoaXMubmVlZHNSZWZyZXNoKCl9fSx7a2V5OiJzZWxlY3QiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD0hMCx0aGlzLm5lZWRzUmVmcmVzaCgpfX0se2tleToidW5zZWxlY3QiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD0hMSx0aGlzLm5lZWRzUmVmcmVzaCgpfX0se2tleToibmVlZHNSZWZyZXNoIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2hhcGUucmVmcmVzaE5lZWRlZD0hMH19LHtrZXk6ImdldFRpdGxlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudGl0bGV9fSx7a2V5OiJkaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnNoYXBlLmRpc3RhbmNlVG9Cb3JkZXIodCxlKX19LHtrZXk6ImlzRml4ZWQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5maXhlZC54JiZ0aGlzLm9wdGlvbnMuZml4ZWQueX19LHtrZXk6ImlzU2VsZWN0ZWQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0ZWR9fSx7a2V5OiJnZXRWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlfX0se2tleToic2V0VmFsdWVSYW5nZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2lmKHZvaWQgMCE9PXRoaXMub3B0aW9ucy52YWx1ZSl7dmFyIG89dGhpcy5vcHRpb25zLnNjYWxpbmcuY3VzdG9tU2NhbGluZ0Z1bmN0aW9uKHQsZSxpLHRoaXMub3B0aW9ucy52YWx1ZSksbj10aGlzLm9wdGlvbnMuc2NhbGluZy5tYXgtdGhpcy5vcHRpb25zLnNjYWxpbmcubWluO2lmKCEwPT09dGhpcy5vcHRpb25zLnNjYWxpbmcubGFiZWwuZW5hYmxlZCl7dmFyIHM9dGhpcy5vcHRpb25zLnNjYWxpbmcubGFiZWwubWF4LXRoaXMub3B0aW9ucy5zY2FsaW5nLmxhYmVsLm1pbjt0aGlzLm9wdGlvbnMuZm9udC5zaXplPXRoaXMub3B0aW9ucy5zY2FsaW5nLmxhYmVsLm1pbitvKnN9dGhpcy5vcHRpb25zLnNpemU9dGhpcy5vcHRpb25zLnNjYWxpbmcubWluK28qbn1lbHNlIHRoaXMub3B0aW9ucy5zaXplPXRoaXMuYmFzZVNpemUsdGhpcy5vcHRpb25zLmZvbnQuc2l6ZT10aGlzLmJhc2VGb250U2l6ZTt0aGlzLnVwZGF0ZUxhYmVsTW9kdWxlKCl9fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEZvcm1hdHRpbmdWYWx1ZXMoKTt0aGlzLnNoYXBlLmRyYXcodCx0aGlzLngsdGhpcy55LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixlKX19LHtrZXk6InVwZGF0ZUJvdW5kaW5nQm94Iix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLnNoYXBlLnVwZGF0ZUJvdW5kaW5nQm94KHRoaXMueCx0aGlzLnksdCl9fSx7a2V5OiJyZXNpemUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0Rm9ybWF0dGluZ1ZhbHVlcygpO3RoaXMuc2hhcGUucmVzaXplKHQsdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUpfX0se2tleToiaXNPdmVybGFwcGluZ1dpdGgiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNoYXBlLmxlZnQ8dC5yaWdodCYmdGhpcy5zaGFwZS5sZWZ0K3RoaXMuc2hhcGUud2lkdGg+dC5sZWZ0JiZ0aGlzLnNoYXBlLnRvcDx0LmJvdHRvbSYmdGhpcy5zaGFwZS50b3ArdGhpcy5zaGFwZS5oZWlnaHQ+dC50b3B9fSx7a2V5OiJpc0JvdW5kaW5nQm94T3ZlcmxhcHBpbmdXaXRoIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zaGFwZS5ib3VuZGluZ0JveC5sZWZ0PHQucmlnaHQmJnRoaXMuc2hhcGUuYm91bmRpbmdCb3gucmlnaHQ+dC5sZWZ0JiZ0aGlzLnNoYXBlLmJvdW5kaW5nQm94LnRvcDx0LmJvdHRvbSYmdGhpcy5zaGFwZS5ib3VuZGluZ0JveC5ib3R0b20+dC50b3B9fV0sW3trZXk6InBhcnNlT3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG49WyJjb2xvciIsImZvbnQiLCJmaXhlZCIsInNoYWRvdyJdO2lmKGwuc2VsZWN0aXZlTm90RGVlcEV4dGVuZChuLHQsZSxpKSxsLm1lcmdlT3B0aW9ucyh0LGUsInNoYWRvdyIsaSxvKSx2b2lkIDAhPT1lLmNvbG9yJiZudWxsIT09ZS5jb2xvcil7dmFyIHM9bC5wYXJzZUNvbG9yKGUuY29sb3IpO2wuZmlsbElmRGVmaW5lZCh0LmNvbG9yLHMpfWVsc2UhMD09PWkmJm51bGw9PT1lLmNvbG9yJiYodC5jb2xvcj1sLmJyaWRnZU9iamVjdChvLmNvbG9yKSk7dm9pZCAwIT09ZS5maXhlZCYmbnVsbCE9PWUuZml4ZWQmJigiYm9vbGVhbiI9PXR5cGVvZiBlLmZpeGVkPyh0LmZpeGVkLng9ZS5maXhlZCx0LmZpeGVkLnk9ZS5maXhlZCk6KHZvaWQgMCE9PWUuZml4ZWQueCYmImJvb2xlYW4iPT10eXBlb2YgZS5maXhlZC54JiYodC5maXhlZC54PWUuZml4ZWQueCksdm9pZCAwIT09ZS5maXhlZC55JiYiYm9vbGVhbiI9PXR5cGVvZiBlLmZpeGVkLnkmJih0LmZpeGVkLnk9ZS5maXhlZC55KSkpLHZvaWQgMCE9PWUuZm9udCYmbnVsbCE9PWUuZm9udD91LnBhcnNlT3B0aW9ucyh0LmZvbnQsZSk6ITA9PT1pJiZudWxsPT09ZS5mb250JiYodC5mb250PWwuYnJpZGdlT2JqZWN0KG8uZm9udCkpLHZvaWQgMCE9PWUuc2NhbGluZyYmbC5tZXJnZU9wdGlvbnModC5zY2FsaW5nLGUuc2NhbGluZywibGFiZWwiLGksby5zY2FsaW5nKX19XSksdH0oKSk7ZS5kZWZhdWx0PU99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzApLHM9byhuKSxyPWkoMiksYT1vKHIpLGg9aSg2MiksZD1vKGgpLGw9aSgxMzQpLHU9byhsKSxjPWkoMTM1KSxwPW8oYyksZj1pKDEpLG09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTsoMCx1LmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5wb2ludFRvU2VsZj0hMSx0aGlzLmJhc2VTaXplPXZvaWQgMCx0aGlzLmZvbnRPcHRpb25zPXt9LHRoaXMuc2V0T3B0aW9ucyhpKSx0aGlzLnNpemU9e3RvcDowLGxlZnQ6MCx3aWR0aDowLGhlaWdodDowLHlMaW5lOjB9LHRoaXMuaXNFZGdlTGFiZWw9b31yZXR1cm4oMCxwLmRlZmF1bHQpKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07dGhpcy5lbGVtZW50T3B0aW9ucz1lLHRoaXMuZm9udE9wdGlvbnM9Zi5kZWVwRXh0ZW5kKHt9LGUuZm9udCwhMCksdm9pZCAwIT09ZS5sYWJlbCYmKHRoaXMubGFiZWxEaXJ0eT0hMCksdm9pZCAwIT09ZS5mb250JiYodC5wYXJzZU9wdGlvbnModGhpcy5mb250T3B0aW9ucyxlLGkpLCJzdHJpbmciPT10eXBlb2YgZS5mb250P3RoaXMuYmFzZVNpemU9dGhpcy5mb250T3B0aW9ucy5zaXplOiJvYmplY3QiPT09KDAsZC5kZWZhdWx0KShlLmZvbnQpJiZ2b2lkIDAhPT1lLmZvbnQuc2l6ZSYmKHRoaXMuYmFzZVNpemU9ZS5mb250LnNpemUpKX19LHtrZXk6ImNvbnN0cmFpbiIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3RoaXMuZm9udE9wdGlvbnMuY29uc3RyYWluV2lkdGg9ITEsdGhpcy5mb250T3B0aW9ucy5tYXhXZHQ9LTEsdGhpcy5mb250T3B0aW9ucy5taW5XZHQ9LTE7dmFyIG89W2UsdCxpXSxuPWYudG9wTW9zdChvLCJ3aWR0aENvbnN0cmFpbnQiKTtpZigibnVtYmVyIj09dHlwZW9mIG4pdGhpcy5mb250T3B0aW9ucy5tYXhXZHQ9TnVtYmVyKG4pLHRoaXMuZm9udE9wdGlvbnMubWluV2R0PU51bWJlcihuKTtlbHNlIGlmKCJvYmplY3QiPT09KHZvaWQgMD09PW4/InVuZGVmaW5lZCI6KDAsZC5kZWZhdWx0KShuKSkpe3ZhciBzPWYudG9wTW9zdChvLFsid2lkdGhDb25zdHJhaW50IiwibWF4aW11bSJdKTsibnVtYmVyIj09dHlwZW9mIHMmJih0aGlzLmZvbnRPcHRpb25zLm1heFdkdD1OdW1iZXIocykpO3ZhciByPWYudG9wTW9zdChvLFsid2lkdGhDb25zdHJhaW50IiwibWluaW11bSJdKTsibnVtYmVyIj09dHlwZW9mIHImJih0aGlzLmZvbnRPcHRpb25zLm1pbldkdD1OdW1iZXIocikpfQp0aGlzLmZvbnRPcHRpb25zLmNvbnN0cmFpbkhlaWdodD0hMSx0aGlzLmZvbnRPcHRpb25zLm1pbkhndD0tMSx0aGlzLmZvbnRPcHRpb25zLnZhbGlnbj0ibWlkZGxlIjt2YXIgYT1mLnRvcE1vc3QobywiaGVpZ2h0Q29uc3RyYWludCIpO2lmKCJudW1iZXIiPT10eXBlb2YgYSl0aGlzLmZvbnRPcHRpb25zLm1pbkhndD1OdW1iZXIoYSk7ZWxzZSBpZigib2JqZWN0Ij09PSh2b2lkIDA9PT1hPyJ1bmRlZmluZWQiOigwLGQuZGVmYXVsdCkoYSkpKXt2YXIgaD1mLnRvcE1vc3QobyxbImhlaWdodENvbnN0cmFpbnQiLCJtaW5pbXVtIl0pOyJudW1iZXIiPT10eXBlb2YgaCYmKHRoaXMuZm9udE9wdGlvbnMubWluSGd0PU51bWJlcihoKSk7dmFyIGw9Zi50b3BNb3N0KG8sWyJoZWlnaHRDb25zdHJhaW50IiwidmFsaWduIl0pOyJzdHJpbmciPT10eXBlb2YgbCYmKCJ0b3AiIT09bCYmImJvdHRvbSIhPT1sfHwodGhpcy5mb250T3B0aW9ucy52YWxpZ249bCkpfX19LHtrZXk6ImNob29zaWZ5Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dGhpcy5mb250T3B0aW9ucy5jaG9vc2VyPSEwO3ZhciBvPVtlLHQsaV0sbj1mLnRvcE1vc3QobywiY2hvc2VuIik7aWYoImJvb2xlYW4iPT10eXBlb2Ygbil0aGlzLmZvbnRPcHRpb25zLmNob29zZXI9bjtlbHNlIGlmKCJvYmplY3QiPT09KHZvaWQgMD09PW4/InVuZGVmaW5lZCI6KDAsZC5kZWZhdWx0KShuKSkpe3ZhciBzPWYudG9wTW9zdChvLFsiY2hvc2VuIiwibGFiZWwiXSk7ImJvb2xlYW4iIT10eXBlb2YgcyYmImZ1bmN0aW9uIiE9dHlwZW9mIHN8fCh0aGlzLmZvbnRPcHRpb25zLmNob29zZXI9cyl9fX0se2tleToiYWRqdXN0U2l6ZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQ/dC5yaWdodCt0LmxlZnQ6MDt0aGlzLmZvbnRPcHRpb25zLmNvbnN0cmFpbldpZHRoJiYodGhpcy5mb250T3B0aW9ucy5tYXhXZHQtPWUsdGhpcy5mb250T3B0aW9ucy5taW5XZHQtPWUpO3ZhciBpPXQ/dC50b3ArdC5ib3R0b206MDt0aGlzLmZvbnRPcHRpb25zLmNvbnN0cmFpbkhlaWdodCYmKHRoaXMuZm9udE9wdGlvbnMubWluSGd0LT1pKX19LHtrZXk6InByb3BhZ2F0ZUZvbnRzIix2YWx1ZTpmdW5jdGlvbihlLGksbyl7aWYodGhpcy5mb250T3B0aW9ucy5tdWx0aSl7dmFyIG49ZnVuY3Rpb24odCxlKXtpZighdHx8IXQuZm9udClyZXR1cm4gbnVsbDt2YXIgaT10LmZvbnQ7aWYoZSl7aWYoIWlbZV0pcmV0dXJuIG51bGw7aT1pW2VdfXJldHVybiBpfSxzPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1uKHQsZSk7cmV0dXJuIG8mJm8uaGFzT3duUHJvcGVydHkoaSk/b1tpXTpudWxsfSxyPVsiYm9sZCIsIml0YWwiLCJib2xkaXRhbCIsIm1vbm8iXSxoPSEwLGQ9ITEsbD12b2lkIDA7dHJ5e2Zvcih2YXIgdSxjPSgwLGEuZGVmYXVsdCkocik7IShoPSh1PWMubmV4dCgpKS5kb25lKTtoPSEwKXt2YXIgcD11LnZhbHVlLGY9dGhpcy5mb250T3B0aW9uc1twXSxtPW8uZm9udFtwXTtpZih0LnBhcnNlRm9udFN0cmluZyhmLG4oZSxwKSkpZi52YWRqdXN0PXRoaXMuZm9udE9wdGlvbnMudmFkanVzdCxmLm1vZD1tLm1vZDtlbHNle2YuZmFjZT1zKGUscCwiZmFjZSIpfHxzKGkscCwiZmFjZSIpfHwoIm1vbm8iPT09cD9tLmZhY2U6bnVsbCl8fHMoaSxudWxsLCJmYWNlIil8fHRoaXMuZm9udE9wdGlvbnMuZmFjZSxmLmNvbG9yPXMoZSxwLCJjb2xvciIpfHxzKGkscCwiY29sb3IiKXx8cyhpLG51bGwsImNvbG9yIil8fHRoaXMuZm9udE9wdGlvbnMuY29sb3IsZi5tb2Q9cyhlLHAsIm1vZCIpfHxzKGkscCwibW9kIil8fHMoaSxudWxsLCJtb2QiKXx8bS5tb2Q7dmFyIHY9dm9pZCAwO2YuZmFjZT09PW0uZmFjZSYmdGhpcy5mb250T3B0aW9ucy5mYWNlPT09by5mb250LmZhY2UmJih2PXRoaXMuZm9udE9wdGlvbnMuc2l6ZS9OdW1iZXIoby5mb250LnNpemUpKSxmLnNpemU9cyhlLHAsInNpemUiKXx8cyhpLHAsInNpemUiKXx8KHY/bS5zaXplKnY6bnVsbCl8fHMoaSxudWxsLCJzaXplIil8fHRoaXMuZm9udE9wdGlvbnMuc2l6ZSxmLnZhZGp1c3Q9cyhlLHAsInZhZGp1c3QiKXx8cyhpLHAsInZhZGp1c3QiKXx8KHY/bS52YWRqdXN0Kk1hdGgucm91bmQodik6bnVsbCl8fHRoaXMuZm9udE9wdGlvbnMudmFkanVzdH1mLnNpemU9TnVtYmVyKGYuc2l6ZSksZi52YWRqdXN0PU51bWJlcihmLnZhZGp1c3QpfX1jYXRjaCh0KXtkPSEwLGw9dH1maW5hbGx5e3RyeXshaCYmYy5yZXR1cm4mJmMucmV0dXJuKCl9ZmluYWxseXtpZihkKXRocm93IGx9fX19fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XToibWlkZGxlIjtpZih2b2lkIDAhPT10aGlzLmVsZW1lbnRPcHRpb25zLmxhYmVsKXt2YXIgcj10aGlzLmZvbnRPcHRpb25zLnNpemUqdGhpcy5ib2R5LnZpZXcuc2NhbGU7dGhpcy5lbGVtZW50T3B0aW9ucy5sYWJlbCYmcjx0aGlzLmVsZW1lbnRPcHRpb25zLnNjYWxpbmcubGFiZWwuZHJhd1RocmVzaG9sZC0xfHwodGhpcy5jYWxjdWxhdGVMYWJlbFNpemUodCxvLG4sZSxpLHMpLHRoaXMuX2RyYXdCYWNrZ3JvdW5kKHQpLHRoaXMuX2RyYXdUZXh0KHQsbyxuLGUsaSxzKSl9fX0se2tleToiX2RyYXdCYWNrZ3JvdW5kIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10aGlzLmZvbnRPcHRpb25zLmJhY2tncm91bmQmJiJub25lIiE9PXRoaXMuZm9udE9wdGlvbnMuYmFja2dyb3VuZCl7dC5maWxsU3R5bGU9dGhpcy5mb250T3B0aW9ucy5iYWNrZ3JvdW5kO2lmKHRoaXMuaXNFZGdlTGFiZWwpc3dpdGNoKHRoaXMuZm9udE9wdGlvbnMuYWxpZ24pe2Nhc2UibWlkZGxlIjp0LmZpbGxSZWN0KC41Ki10aGlzLnNpemUud2lkdGgsLjUqLXRoaXMuc2l6ZS5oZWlnaHQsdGhpcy5zaXplLndpZHRoLHRoaXMuc2l6ZS5oZWlnaHQpO2JyZWFrO2Nhc2UidG9wIjp0LmZpbGxSZWN0KC41Ki10aGlzLnNpemUud2lkdGgsLSh0aGlzLnNpemUuaGVpZ2h0KzIpLHRoaXMuc2l6ZS53aWR0aCx0aGlzLnNpemUuaGVpZ2h0KTticmVhaztjYXNlImJvdHRvbSI6dC5maWxsUmVjdCguNSotdGhpcy5zaXplLndpZHRoLDIsdGhpcy5zaXplLndpZHRoLHRoaXMuc2l6ZS5oZWlnaHQpO2JyZWFrO2RlZmF1bHQ6dC5maWxsUmVjdCh0aGlzLnNpemUubGVmdCx0aGlzLnNpemUudG9wLTEsdGhpcy5zaXplLndpZHRoLHRoaXMuc2l6ZS5oZWlnaHQpfWVsc2UgdC5maWxsUmVjdCh0aGlzLnNpemUubGVmdCx0aGlzLnNpemUudG9wLTEsdGhpcy5zaXplLndpZHRoLHRoaXMuc2l6ZS5oZWlnaHQpfX19LHtrZXk6Il9kcmF3VGV4dCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06Im1pZGRsZSIsYT10aGlzLmZvbnRPcHRpb25zLnNpemUsaD1hKnRoaXMuYm9keS52aWV3LnNjYWxlO2g+PXRoaXMuZWxlbWVudE9wdGlvbnMuc2NhbGluZy5sYWJlbC5tYXhWaXNpYmxlJiYoYT1OdW1iZXIodGhpcy5lbGVtZW50T3B0aW9ucy5zY2FsaW5nLmxhYmVsLm1heFZpc2libGUpL3RoaXMuYm9keS52aWV3LnNjYWxlKTt2YXIgZD10aGlzLnNpemUueUxpbmUsbD10aGlzLl9zZXRBbGlnbm1lbnQodCxvLGQsciksdT0oMCxzLmRlZmF1bHQpKGwsMik7bz11WzBdLGQ9dVsxXSx0LnRleHRBbGlnbj0ibGVmdCIsby09dGhpcy5zaXplLndpZHRoLzIsdGhpcy5mb250T3B0aW9ucy52YWxpZ24mJnRoaXMuc2l6ZS5oZWlnaHQ+dGhpcy5zaXplLmxhYmVsSGVpZ2h0JiYoInRvcCI9PT10aGlzLmZvbnRPcHRpb25zLnZhbGlnbiYmKGQtPSh0aGlzLnNpemUuaGVpZ2h0LXRoaXMuc2l6ZS5sYWJlbEhlaWdodCkvMiksImJvdHRvbSI9PT10aGlzLmZvbnRPcHRpb25zLnZhbGlnbiYmKGQrPSh0aGlzLnNpemUuaGVpZ2h0LXRoaXMuc2l6ZS5sYWJlbEhlaWdodCkvMikpO2Zvcih2YXIgYz0wO2M8dGhpcy5saW5lQ291bnQ7YysrKWlmKHRoaXMubGluZXNbY10mJnRoaXMubGluZXNbY10uYmxvY2tzKXt2YXIgcD0wO3RoaXMuaXNFZGdlTGFiZWx8fCJjZW50ZXIiPT09dGhpcy5mb250T3B0aW9ucy5hbGlnbj9wKz0odGhpcy5zaXplLndpZHRoLXRoaXMubGluZXNbY10ud2lkdGgpLzI6InJpZ2h0Ij09PXRoaXMuZm9udE9wdGlvbnMuYWxpZ24mJihwKz10aGlzLnNpemUud2lkdGgtdGhpcy5saW5lc1tjXS53aWR0aCk7Zm9yKHZhciBmPTA7Zjx0aGlzLmxpbmVzW2NdLmJsb2Nrcy5sZW5ndGg7ZisrKXt2YXIgbT10aGlzLmxpbmVzW2NdLmJsb2Nrc1tmXTt0LmZvbnQ9bS5mb250O3ZhciB2PXRoaXMuX2dldENvbG9yKG0uY29sb3IsaCxtLnN0cm9rZUNvbG9yKSxnPSgwLHMuZGVmYXVsdCkodiwyKSx5PWdbMF0sYj1nWzFdO20uc3Ryb2tlV2lkdGg+MCYmKHQubGluZVdpZHRoPW0uc3Ryb2tlV2lkdGgsdC5zdHJva2VTdHlsZT1iLHQubGluZUpvaW49InJvdW5kIiksdC5maWxsU3R5bGU9eSxtLnN0cm9rZVdpZHRoPjAmJnQuc3Ryb2tlVGV4dChtLnRleHQsbytwLGQrbS52YWRqdXN0KSx0LmZpbGxUZXh0KG0udGV4dCxvK3AsZCttLnZhZGp1c3QpLHArPW0ud2lkdGh9ZCs9dGhpcy5saW5lc1tjXS5oZWlnaHR9fX0se2tleToiX3NldEFsaWdubWVudCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7aWYodGhpcy5pc0VkZ2VMYWJlbCYmImhvcml6b250YWwiIT09dGhpcy5mb250T3B0aW9ucy5hbGlnbiYmITE9PT10aGlzLnBvaW50VG9TZWxmKXtlPTAsaT0wOyJ0b3AiPT09dGhpcy5mb250T3B0aW9ucy5hbGlnbj8odC50ZXh0QmFzZWxpbmU9ImFscGhhYmV0aWMiLGktPTQpOiJib3R0b20iPT09dGhpcy5mb250T3B0aW9ucy5hbGlnbj8odC50ZXh0QmFzZWxpbmU9ImhhbmdpbmciLGkrPTQpOnQudGV4dEJhc2VsaW5lPSJtaWRkbGUifWVsc2UgdC50ZXh0QmFzZWxpbmU9bztyZXR1cm5bZSxpXX19LHtrZXk6Il9nZXRDb2xvciIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXR8fCIjMDAwMDAwIixuPWl8fCIjZmZmZmZmIjtpZihlPD10aGlzLmVsZW1lbnRPcHRpb25zLnNjYWxpbmcubGFiZWwuZHJhd1RocmVzaG9sZCl7dmFyIHM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLDEtKHRoaXMuZWxlbWVudE9wdGlvbnMuc2NhbGluZy5sYWJlbC5kcmF3VGhyZXNob2xkLWUpKSk7bz1mLm92ZXJyaWRlT3BhY2l0eShvLHMpLG49Zi5vdmVycmlkZU9wYWNpdHkobixzKX1yZXR1cm5bbyxuXX19LHtrZXk6ImdldFRleHRTaXplIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTtyZXR1cm4gdGhpcy5fcHJvY2Vzc0xhYmVsKHQsZSxpKSx7d2lkdGg6dGhpcy5zaXplLndpZHRoLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0LGxpbmVDb3VudDp0aGlzLmxpbmVDb3VudH19fSx7a2V5OiJjYWxjdWxhdGVMYWJlbFNpemUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxuPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTowLHM9YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOiJtaWRkbGUiOyEwPT09dGhpcy5sYWJlbERpcnR5JiZ0aGlzLl9wcm9jZXNzTGFiZWwodCxlLGkpLHRoaXMuc2l6ZS5sZWZ0PW8tLjUqdGhpcy5zaXplLndpZHRoLHRoaXMuc2l6ZS50b3A9bi0uNSp0aGlzLnNpemUuaGVpZ2h0LHRoaXMuc2l6ZS55TGluZT1uKy41KigxLXRoaXMubGluZUNvdW50KSp0aGlzLmZvbnRPcHRpb25zLnNpemUsImhhbmdpbmciPT09cyYmKHRoaXMuc2l6ZS50b3ArPS41KnRoaXMuZm9udE9wdGlvbnMuc2l6ZSx0aGlzLnNpemUudG9wKz00LHRoaXMuc2l6ZS55TGluZSs9NCksdGhpcy5sYWJlbERpcnR5PSExfX0se2tleToiZGVjb2RlTWFya3VwU3lzdGVtIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0ibm9uZSI7cmV0dXJuIm1hcmtkb3duIj09PXR8fCJtZCI9PT10P2U9Im1hcmtkb3duIjohMCE9PXQmJiJodG1sIiE9PXR8fChlPSJodG1sIiksZX19LHtrZXk6InNwbGl0QmxvY2tzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZGVjb2RlTWFya3VwU3lzdGVtKGUpO3JldHVybiJub25lIj09PWk/W3t0ZXh0OnQsbW9kOiJub3JtYWwifV06Im1hcmtkb3duIj09PWk/dGhpcy5zcGxpdE1hcmtkb3duQmxvY2tzKHQpOiJodG1sIj09PWk/dGhpcy5zcGxpdEh0bWxCbG9ja3ModCk6dm9pZCAwfX0se2tleToic3BsaXRNYXJrZG93bkJsb2NrcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9W10saT17Ym9sZDohMSxpdGFsOiExLG1vbm86ITEsYmVnaW5hYmxlOiEwLHNwYWNpbmc6ITEscG9zaXRpb246MCxidWZmZXI6IiIsbW9kU3RhY2s6W119O2ZvcihpLm1vZD1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5tb2RTdGFjay5sZW5ndGg/Im5vcm1hbCI6dGhpcy5tb2RTdGFja1swXX0saS5tb2ROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLm1vZFN0YWNrLmxlbmd0aD8ibm9ybWFsIjoibW9ubyI9PT10aGlzLm1vZFN0YWNrWzBdPyJtb25vIjppLmJvbGQmJmkuaXRhbD8iYm9sZGl0YWwiOmkuYm9sZD8iYm9sZCI6aS5pdGFsPyJpdGFsIjp2b2lkIDB9LGkuZW1pdEJsb2NrPWZ1bmN0aW9uKCl7YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTt0aGlzLnNwYWNpbmcmJih0aGlzLmFkZCgiICIpLHRoaXMuc3BhY2luZz0hMSksdGhpcy5idWZmZXIubGVuZ3RoPjAmJihlLnB1c2goe3RleHQ6dGhpcy5idWZmZXIsbW9kOnRoaXMubW9kTmFtZSgpfSksdGhpcy5idWZmZXI9IiIpfSxpLmFkZD1mdW5jdGlvbih0KXsiICI9PT10JiYoaS5zcGFjaW5nPSEwKSxpLnNwYWNpbmcmJih0aGlzLmJ1ZmZlcis9IiAiLHRoaXMuc3BhY2luZz0hMSksIiAiIT10JiYodGhpcy5idWZmZXIrPXQpfTtpLnBvc2l0aW9uPHQubGVuZ3RoOyl7dmFyIG89dC5jaGFyQXQoaS5wb3NpdGlvbik7L1sgXHRdLy50ZXN0KG8pPyhpLm1vbm8/aS5hZGQobyk6aS5zcGFjaW5nPSEwLGkuYmVnaW5hYmxlPSEwKTovXFwvLnRlc3Qobyk/aS5wb3NpdGlvbjx0Lmxlbmd0aCsxJiYoaS5wb3NpdGlvbisrLG89dC5jaGFyQXQoaS5wb3NpdGlvbiksLyBcdC8udGVzdChvKT9pLnNwYWNpbmc9ITA6KGkuYWRkKG8pLGkuYmVnaW5hYmxlPSExKSk6aS5tb25vfHxpLmJvbGR8fCFpLmJlZ2luYWJsZSYmIWkuc3BhY2luZ3x8IS9cKi8udGVzdChvKT9pLm1vbm98fGkuaXRhbHx8IWkuYmVnaW5hYmxlJiYhaS5zcGFjaW5nfHwhL1xfLy50ZXN0KG8pPyFpLm1vbm8mJihpLmJlZ2luYWJsZXx8aS5zcGFjaW5nKSYmL2AvLnRlc3Qobyk/KGkuZW1pdEJsb2NrKCksaS5tb25vPSEwLGkubW9kU3RhY2sudW5zaGlmdCgibW9ubyIpKTohaS5tb25vJiYiYm9sZCI9PT1pLm1vZCgpJiYvXCovLnRlc3Qobyk/aS5wb3NpdGlvbj09PXQubGVuZ3RoLTF8fC9bLixfYCBcdFxuXS8udGVzdCh0LmNoYXJBdChpLnBvc2l0aW9uKzEpKT8oaS5lbWl0QmxvY2soKSxpLmJvbGQ9ITEsaS5tb2RTdGFjay5zaGlmdCgpKTppLmFkZChvKTohaS5tb25vJiYiaXRhbCI9PT1pLm1vZCgpJiYvXF8vLnRlc3Qobyk/aS5wb3NpdGlvbj09PXQubGVuZ3RoLTF8fC9bLiwqYCBcdFxuXS8udGVzdCh0LmNoYXJBdChpLnBvc2l0aW9uKzEpKT8oaS5lbWl0QmxvY2soKSxpLml0YWw9ITEsaS5tb2RTdGFjay5zaGlmdCgpKTppLmFkZChvKTppLm1vbm8mJiJtb25vIj09PWkubW9kKCkmJi9gLy50ZXN0KG8pP2kucG9zaXRpb249PT10Lmxlbmd0aC0xfHwvWy4sKl8gXHRcbl0vLnRlc3QodC5jaGFyQXQoaS5wb3NpdGlvbisxKSk/KGkuZW1pdEJsb2NrKCksaS5tb25vPSExLGkubW9kU3RhY2suc2hpZnQoKSk6aS5hZGQobyk6KGkuYWRkKG8pLGkuYmVnaW5hYmxlPSExKTooaS5lbWl0QmxvY2soKSxpLml0YWw9ITAsaS5tb2RTdGFjay51bnNoaWZ0KCJpdGFsIikpOihpLmVtaXRCbG9jaygpLGkuYm9sZD0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoImJvbGQiKSksaS5wb3NpdGlvbisrfXJldHVybiBpLmVtaXRCbG9jaygpLGV9fSx7a2V5OiJzcGxpdEh0bWxCbG9ja3MiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLGk9e2JvbGQ6ITEsaXRhbDohMSxtb25vOiExLHNwYWNpbmc6ITEscG9zaXRpb246MCxidWZmZXI6IiIsbW9kU3RhY2s6W119O2ZvcihpLm1vZD1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5tb2RTdGFjay5sZW5ndGg/Im5vcm1hbCI6dGhpcy5tb2RTdGFja1swXX0saS5tb2ROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLm1vZFN0YWNrLmxlbmd0aD8ibm9ybWFsIjoibW9ubyI9PT10aGlzLm1vZFN0YWNrWzBdPyJtb25vIjppLmJvbGQmJmkuaXRhbD8iYm9sZGl0YWwiOmkuYm9sZD8iYm9sZCI6aS5pdGFsPyJpdGFsIjp2b2lkIDB9LGkuZW1pdEJsb2NrPWZ1bmN0aW9uKCl7YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTt0aGlzLnNwYWNpbmcmJih0aGlzLmFkZCgiICIpLHRoaXMuc3BhY2luZz0hMSksdGhpcy5idWZmZXIubGVuZ3RoPjAmJihlLnB1c2goe3RleHQ6dGhpcy5idWZmZXIsbW9kOnRoaXMubW9kTmFtZSgpfSksdGhpcy5idWZmZXI9IiIpfSxpLmFkZD1mdW5jdGlvbih0KXsiICI9PT10JiYoaS5zcGFjaW5nPSEwKSxpLnNwYWNpbmcmJih0aGlzLmJ1ZmZlcis9IiAiLHRoaXMuc3BhY2luZz0hMSksIiAiIT10JiYodGhpcy5idWZmZXIrPXQpfTtpLnBvc2l0aW9uPHQubGVuZ3RoOyl7dmFyIG89dC5jaGFyQXQoaS5wb3NpdGlvbik7L1sgXHRdLy50ZXN0KG8pP2kubW9ubz9pLmFkZChvKTppLnNwYWNpbmc9ITA6LzwvLnRlc3Qobyk/aS5tb25vfHxpLmJvbGR8fCEvPGI+Ly50ZXN0KHQuc3Vic3RyKGkucG9zaXRpb24sMykpP2kubW9ub3x8aS5pdGFsfHwhLzxpPi8udGVzdCh0LnN1YnN0cihpLnBvc2l0aW9uLDMpKT8haS5tb25vJiYvPGNvZGU+Ly50ZXN0KHQuc3Vic3RyKGkucG9zaXRpb24sNikpPyhpLmVtaXRCbG9jaygpLGkubW9ubz0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoIm1vbm8iKSxpLnBvc2l0aW9uKz01KTohaS5tb25vJiYiYm9sZCI9PT1pLm1vZCgpJiYvPFwvYj4vLnRlc3QodC5zdWJzdHIoaS5wb3NpdGlvbiw0KSk/KGkuZW1pdEJsb2NrKCksaS5ib2xkPSExLGkubW9kU3RhY2suc2hpZnQoKSxpLnBvc2l0aW9uKz0zKTohaS5tb25vJiYiaXRhbCI9PT1pLm1vZCgpJiYvPFwvaT4vLnRlc3QodC5zdWJzdHIoaS5wb3NpdGlvbiw0KSk/KGkuZW1pdEJsb2NrKCksaS5pdGFsPSExLGkubW9kU3RhY2suc2hpZnQoKSxpLnBvc2l0aW9uKz0zKToibW9ubyI9PT1pLm1vZCgpJiYvPFwvY29kZT4vLnRlc3QodC5zdWJzdHIoaS5wb3NpdGlvbiw3KSk/KGkuZW1pdEJsb2NrKCksaS5tb25vPSExLGkubW9kU3RhY2suc2hpZnQoKSxpLnBvc2l0aW9uKz02KTppLmFkZChvKTooaS5lbWl0QmxvY2soKSxpLml0YWw9ITAsaS5tb2RTdGFjay51bnNoaWZ0KCJpdGFsIiksaS5wb3NpdGlvbis9Mik6KGkuZW1pdEJsb2NrKCksaS5ib2xkPSEwLGkubW9kU3RhY2sudW5zaGlmdCgiYm9sZCIpLGkucG9zaXRpb24rPTIpOi8mLy50ZXN0KG8pPy8mbHQ7Ly50ZXN0KHQuc3Vic3RyKGkucG9zaXRpb24sNCkpPyhpLmFkZCgiPCIpLGkucG9zaXRpb24rPTMpOi8mYW1wOy8udGVzdCh0LnN1YnN0cihpLnBvc2l0aW9uLDUpKT8oaS5hZGQoIiYiKSxpLnBvc2l0aW9uKz00KTppLmFkZCgiJiIpOmkuYWRkKG8pLGkucG9zaXRpb24rK31yZXR1cm4gaS5lbWl0QmxvY2soKSxlfX0se2tleToiZ2V0Rm9ybWF0dGluZ1ZhbHVlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49ZnVuY3Rpb24odCxlLGkpe3JldHVybiJub3JtYWwiPT09ZT8ibW9kIj09PWk/IiI6dFtpXTp0W2VdW2ldP3RbZV1baV06dFtpXX0scz17Y29sb3I6bih0aGlzLmZvbnRPcHRpb25zLG8sImNvbG9yIiksc2l6ZTpuKHRoaXMuZm9udE9wdGlvbnMsbywic2l6ZSIpLGZhY2U6bih0aGlzLmZvbnRPcHRpb25zLG8sImZhY2UiKSxtb2Q6bih0aGlzLmZvbnRPcHRpb25zLG8sIm1vZCIpLHZhZGp1c3Q6bih0aGlzLmZvbnRPcHRpb25zLG8sInZhZGp1c3QiKSxzdHJva2VXaWR0aDp0aGlzLmZvbnRPcHRpb25zLnN0cm9rZVdpZHRoLHN0cm9rZUNvbG9yOnRoaXMuZm9udE9wdGlvbnMuc3Ryb2tlQ29sb3J9O3JldHVybiJub3JtYWwiPT09bz8oZXx8aSkmJighMD09PXRoaXMuZm9udE9wdGlvbnMuY2hvb3NlciYmdGhpcy5lbGVtZW50T3B0aW9ucy5sYWJlbEhpZ2hsaWdodEJvbGQ/cy5tb2Q9ImJvbGQiOiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZvbnRPcHRpb25zLmNob29zZXImJnRoaXMuZm9udE9wdGlvbnMuY2hvb3Nlcih0LHMsdGhpcy5lbGVtZW50T3B0aW9ucy5pZCxlLGkpKTooZXx8aSkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZvbnRPcHRpb25zLmNob29zZXImJnRoaXMuZm9udE9wdGlvbnMuY2hvb3Nlcih0LHMsdGhpcy5lbGVtZW50T3B0aW9ucy5pZCxlLGkpLHQuZm9udD0ocy5tb2QrIiAiK3Muc2l6ZSsicHggIitzLmZhY2UpLnJlcGxhY2UoLyIvZywiIikscy5mb250PXQuZm9udCxzLmhlaWdodD1zLnNpemUsc319LHtrZXk6ImRpZmZlcmVudFN0YXRlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0IT09dGhpcy5mb250T3B0aW9ucy5zZWxlY3RlZFN0YXRlJiZlIT09dGhpcy5mb250T3B0aW9ucy5ob3ZlclN0YXRlfX0se2tleToiX3Byb2Nlc3NMYWJlbCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPTAsbj0wLHM9W10scj0wO2lmKHMuYWRkPWZ1bmN0aW9uKHQsZSxpLG8sbixzLHIsYSxoLGQpe3RoaXMubGVuZ3RoPT10JiYodGhpc1t0XT17d2lkdGg6MCxoZWlnaHQ6MCxibG9ja3M6W119KSx0aGlzW3RdLmJsb2Nrcy5wdXNoKHt0ZXh0OmUsZm9udDppLGNvbG9yOm8sd2lkdGg6bixoZWlnaHQ6cyx2YWRqdXN0OnIsbW9kOmEsc3Ryb2tlV2lkdGg6aCxzdHJva2VDb2xvcjpkfSl9LHMuYWNjdW11bGF0ZT1mdW5jdGlvbih0LGUsaSl7dGhpc1t0XS53aWR0aCs9ZSx0aGlzW3RdLmhlaWdodD1pPnRoaXNbdF0uaGVpZ2h0P2k6dGhpc1t0XS5oZWlnaHR9LHMuYWRkQW5kQWNjdW11bGF0ZT1mdW5jdGlvbih0LGUsaSxvLG4scyxyLGEsaCxkKXt0aGlzLmFkZCh0LGUsaSxvLG4scyxyLGEsaCxkKSx0aGlzLmFjY3VtdWxhdGUodCxuLHMpfSx2b2lkIDAhPT10aGlzLmVsZW1lbnRPcHRpb25zLmxhYmVsKXt2YXIgYT1TdHJpbmcodGhpcy5lbGVtZW50T3B0aW9ucy5sYWJlbCkuc3BsaXQoIlxuIiksaD1hLmxlbmd0aDtpZih0aGlzLmVsZW1lbnRPcHRpb25zLmZvbnQubXVsdGkpZm9yKHZhciBkPTA7ZDxoO2QrKyl7dmFyIGw9dGhpcy5zcGxpdEJsb2NrcyhhW2RdLHRoaXMuZWxlbWVudE9wdGlvbnMuZm9udC5tdWx0aSksdT0wLGM9MDtpZihsKXtpZigwPT1sLmxlbmd0aCl7dmFyIHA9dGhpcy5nZXRGb3JtYXR0aW5nVmFsdWVzKHQsZSxpLCJub3JtYWwiKTtzLmFkZEFuZEFjY3VtdWxhdGUociwiIixwLmZvbnQscC5jb2xvciwwLHAuc2l6ZSxwLnZhZGp1c3QsIm5vcm1hbCIscC5zdHJva2VXaWR0aCxwLnN0cm9rZUNvbG9yKSxuKz1zW3JdLmhlaWdodCxyKys7Y29udGludWV9Zm9yKHZhciBmPTA7ZjxsLmxlbmd0aDtmKyspaWYodGhpcy5mb250T3B0aW9ucy5tYXhXZHQ+MClmb3IodmFyIG09dGhpcy5nZXRGb3JtYXR0aW5nVmFsdWVzKHQsZSxpLGxbZl0ubW9kKSx2PWxbZl0udGV4dC5zcGxpdCgiICIpLGc9ITAseT0iIixiPXt3aWR0aDowfSxfPXZvaWQgMCx3PTA7dzx2Lmxlbmd0aDspe3ZhciB4PWc/IiI6IiAiO189YixiPXQubWVhc3VyZVRleHQoeSt4K3Zbd10pLHUrYi53aWR0aD50aGlzLmZvbnRPcHRpb25zLm1heFdkdCYmMCE9Xy53aWR0aD8oYz1tLmhlaWdodD5jP20uaGVpZ2h0OmMscy5hZGQocix5LG0uZm9udCxtLmNvbG9yLF8ud2lkdGgsbS5oZWlnaHQsbS52YWRqdXN0LGxbZl0ubW9kLG0uc3Ryb2tlV2lkdGgsbS5zdHJva2VDb2xvcikscy5hY2N1bXVsYXRlKHIsXy53aWR0aCxjKSx5PSIiLGc9ITAsdT0wLG89c1tyXS53aWR0aD5vP3Nbcl0ud2lkdGg6byxuKz1zW3JdLmhlaWdodCxyKyspOih5PXkreCt2W3ddLHc9PT12Lmxlbmd0aC0xJiYoYz1tLmhlaWdodD5jP20uaGVpZ2h0OmMsdSs9Yi53aWR0aCxzLmFkZChyLHksbS5mb250LG0uY29sb3IsYi53aWR0aCxtLmhlaWdodCxtLnZhZGp1c3QsbFtmXS5tb2QsbS5zdHJva2VXaWR0aCxtLnN0cm9rZUNvbG9yKSxzLmFjY3VtdWxhdGUocixiLndpZHRoLGMpLGY9PT1sLmxlbmd0aC0xJiYobz1zW3JdLndpZHRoPm8/c1tyXS53aWR0aDpvLG4rPXNbcl0uaGVpZ2h0LHIrKykpLHcrKyxnPSExKX1lbHNle3ZhciBrPXRoaXMuZ2V0Rm9ybWF0dGluZ1ZhbHVlcyh0LGUsaSxsW2ZdLm1vZCksTT10Lm1lYXN1cmVUZXh0KGxbZl0udGV4dCk7cy5hZGRBbmRBY2N1bXVsYXRlKHIsbFtmXS50ZXh0LGsuZm9udCxrLmNvbG9yLE0ud2lkdGgsay5oZWlnaHQsay52YWRqdXN0LGxbZl0ubW9kLGsuc3Ryb2tlV2lkdGgsay5zdHJva2VDb2xvciksbz1zW3JdLndpZHRoPm8/c1tyXS53aWR0aDpvLGwubGVuZ3RoLTE9PT1mJiYobis9c1tyXS5oZWlnaHQscisrKX19fWVsc2UgZm9yKHZhciBTPTA7UzxoO1MrKyl7dmFyIEQ9dGhpcy5nZXRGb3JtYXR0aW5nVmFsdWVzKHQsZSxpLCJub3JtYWwiKTtpZih0aGlzLmZvbnRPcHRpb25zLm1heFdkdD4wKWZvcih2YXIgTz1hW1NdLnNwbGl0KCIgIiksQz0iIixUPXt3aWR0aDowfSxFPXZvaWQgMCxQPTA7UDxPLmxlbmd0aDspe3ZhciBJPSIiPT09Qz8iIjoiICI7RT1ULFQ9dC5tZWFzdXJlVGV4dChDK0krT1tQXSksVC53aWR0aD50aGlzLmZvbnRPcHRpb25zLm1heFdkdCYmMCE9RS53aWR0aD8ocy5hZGRBbmRBY2N1bXVsYXRlKHIsQyxELmZvbnQsRC5jb2xvcixFLndpZHRoLEQuc2l6ZSxELnZhZGp1c3QsIm5vcm1hbCIsRC5zdHJva2VXaWR0aCxELnN0cm9rZUNvbG9yKSxvPXNbcl0ud2lkdGg+bz9zW3JdLndpZHRoOm8sbis9c1tyXS5oZWlnaHQsQz0iIixyKyspOihDPUMrSStPW1BdLFA9PT1PLmxlbmd0aC0xJiYocy5hZGRBbmRBY2N1bXVsYXRlKHIsQyxELmZvbnQsRC5jb2xvcixULndpZHRoLEQuc2l6ZSxELnZhZGp1c3QsIm5vcm1hbCIsRC5zdHJva2VXaWR0aCxELnN0cm9rZUNvbG9yKSxvPXNbcl0ud2lkdGg+bz9zW3JdLndpZHRoOm8sbis9c1tyXS5oZWlnaHQscisrKSxQKyspfWVsc2V7dmFyIE49YVtTXSxSPXQubWVhc3VyZVRleHQoTik7cy5hZGRBbmRBY2N1bXVsYXRlKHIsTixELmZvbnQsRC5jb2xvcixSLndpZHRoLEQuc2l6ZSxELnZhZGp1c3QsIm5vcm1hbCIsRC5zdHJva2VXaWR0aCxELnN0cm9rZUNvbG9yKSxvPXNbcl0ud2lkdGg+bz9zW3JdLndpZHRoOm8sbis9c1tyXS5oZWlnaHQscisrfX19dGhpcy5mb250T3B0aW9ucy5taW5XZHQ+MCYmbzx0aGlzLmZvbnRPcHRpb25zLm1pbldkdCYmKG89dGhpcy5mb250T3B0aW9ucy5taW5XZHQpLHRoaXMuc2l6ZS5sYWJlbEhlaWdodD1uLHRoaXMuZm9udE9wdGlvbnMubWluSGd0PjAmJm48dGhpcy5mb250T3B0aW9ucy5taW5IZ3QmJihuPXRoaXMuZm9udE9wdGlvbnMubWluSGd0KSx0aGlzLmxpbmVzPXMsdGhpcy5saW5lQ291bnQ9cy5sZW5ndGgsdGhpcy5zaXplLndpZHRoPW8sdGhpcy5zaXplLmhlaWdodD1uLHRoaXMuc2VsZWN0ZWRTdGF0ZT1lLHRoaXMuaG92ZXJTdGF0ZT1pfX1dLFt7a2V5OiJwYXJzZU9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKGUsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTt0LnBhcnNlRm9udFN0cmluZyhlLGkuZm9udCk/ZS52YWRqdXN0PTA6Im9iamVjdCI9PT0oMCxkLmRlZmF1bHQpKGkuZm9udCkmJmYuZmlsbElmRGVmaW5lZChlLGkuZm9udCxvKSxlLnNpemU9TnVtYmVyKGUuc2l6ZSksZS52YWRqdXN0PU51bWJlcihlLnZhZGp1c3QpfX0se2tleToicGFyc2VGb250U3RyaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuITE7dmFyIGk9ZS5zcGxpdCgiICIpO3JldHVybiB0LnNpemU9aVswXS5yZXBsYWNlKCJweCIsIiIpLHQuZmFjZT1pWzFdLHQuY29sb3I9aVsyXSwhMH19XSksdH0oKTtlLmRlZmF1bHQ9bX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWUuX19lc01vZHVsZT0hMDt2YXIgbj1pKDE3MSkscz1vKG4pLHI9aSgyKSxhPW8ocik7ZS5kZWZhdWx0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciBpPVtdLG89ITAsbj0hMSxzPXZvaWQgMDt0cnl7Zm9yKHZhciByLGg9KDAsYS5kZWZhdWx0KSh0KTshKG89KHI9aC5uZXh0KCkpLmRvbmUpJiYoaS5wdXNoKHIudmFsdWUpLCFlfHxpLmxlbmd0aCE9PWUpO289ITApO31jYXRjaCh0KXtuPSEwLHM9dH1maW5hbGx5e3RyeXshbyYmaC5yZXR1cm4mJmgucmV0dXJuKCl9ZmluYWxseXtpZihuKXRocm93IHN9fXJldHVybiBpfXJldHVybiBmdW5jdGlvbihlLGkpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGU7aWYoKDAscy5kZWZhdWx0KShPYmplY3QoZSkpKXJldHVybiB0KGUsaSk7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZSIpfX0oKX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDE3MiksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKHQsZSxpKXtpKDQpLGkoNTApLHQuZXhwb3J0cz1pKDE3Myl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDU0KSxuPWkoNDcpKCJpdGVyYXRvciIpLHM9aSg4KTt0LmV4cG9ydHM9aSgxNykuaXNJdGVyYWJsZT1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3QodCk7cmV0dXJuIHZvaWQgMCE9PWVbbl18fCJAQGl0ZXJhdG9yImluIGV8fHMuaGFzT3duUHJvcGVydHkobyhlKSl9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTc1KSxzPW8obikscj1pKDEzNCksYT1vKHIpLGg9aSgxMzUpLGQ9byhoKSxsPWkoMTc4KSx1PW8obCksYz1pKDE3OSkscD1vKGMpLGY9aSgxODQpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8peygwLGEuZGVmYXVsdCkodGhpcyxlKTt2YXIgbj0oMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKTtyZXR1cm4gbi5fc2V0TWFyZ2lucyhvKSxufXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuc2VsZWN0ZWQsaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dGhpcy5ob3Zlcjt0aGlzLm5lZWRzUmVmcmVzaChlLGkpJiYodGhpcy50ZXh0U2l6ZT10aGlzLmxhYmVsTW9kdWxlLmdldFRleHRTaXplKHQsZSxpKSx0aGlzLndpZHRoPXRoaXMudGV4dFNpemUud2lkdGgrdGhpcy5tYXJnaW4ucmlnaHQrdGhpcy5tYXJnaW4ubGVmdCx0aGlzLmhlaWdodD10aGlzLnRleHRTaXplLmhlaWdodCt0aGlzLm1hcmdpbi50b3ArdGhpcy5tYXJnaW4uYm90dG9tLHRoaXMucmFkaXVzPXRoaXMud2lkdGgvMil9fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5yZXNpemUodCxvLG4pLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdC5zdHJva2VTdHlsZT1zLmJvcmRlckNvbG9yLHQubGluZVdpZHRoPXMuYm9yZGVyV2lkdGgsdC5saW5lV2lkdGgvPXRoaXMuYm9keS52aWV3LnNjYWxlLHQubGluZVdpZHRoPU1hdGgubWluKHRoaXMud2lkdGgsdC5saW5lV2lkdGgpLHQuZmlsbFN0eWxlPXMuY29sb3IsdC5yb3VuZFJlY3QodGhpcy5sZWZ0LHRoaXMudG9wLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQscy5ib3JkZXJSYWRpdXMpLHRoaXMuZW5hYmxlU2hhZG93KHQscyksdC5maWxsKCksdGhpcy5kaXNhYmxlU2hhZG93KHQscyksdC5zYXZlKCkscy5ib3JkZXJXaWR0aD4wJiYodGhpcy5lbmFibGVCb3JkZXJEYXNoZXModCxzKSx0LnN0cm9rZSgpLHRoaXMuZGlzYWJsZUJvcmRlckRhc2hlcyh0LHMpKSx0LnJlc3RvcmUoKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSx0LG8sbiksdGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQsdGhpcy5sZWZ0K3RoaXMudGV4dFNpemUud2lkdGgvMit0aGlzLm1hcmdpbi5sZWZ0LHRoaXMudG9wK3RoaXMudGV4dFNpemUuaGVpZ2h0LzIrdGhpcy5tYXJnaW4udG9wLG8sbil9fSx7a2V5OiJ1cGRhdGVCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt0aGlzLnJlc2l6ZShpLG8sbiksdGhpcy5sZWZ0PXQtdGhpcy53aWR0aC8yLHRoaXMudG9wPWUtdGhpcy5oZWlnaHQvMjt2YXIgcz10aGlzLm9wdGlvbnMuc2hhcGVQcm9wZXJ0aWVzLmJvcmRlclJhZGl1czt0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dGhpcy5sZWZ0LXMsdGhpcy5ib3VuZGluZ0JveC50b3A9dGhpcy50b3Atcyx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT10aGlzLnRvcCt0aGlzLmhlaWdodCtzLHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9dGhpcy5sZWZ0K3RoaXMud2lkdGgrc319LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5yZXNpemUodCk7dmFyIGk9dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoO3JldHVybiBNYXRoLm1pbihNYXRoLmFicyh0aGlzLndpZHRoLzIvTWF0aC5jb3MoZSkpLE1hdGguYWJzKHRoaXMuaGVpZ2h0LzIvTWF0aC5zaW4oZSkpKStpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoMTc2KSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe2koMTc3KSx0LmV4cG9ydHM9aSgxNykuT2JqZWN0LmdldFByb3RvdHlwZU9mfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg0OSksbj1pKDQ4KTtpKDYxKSgiZ2V0UHJvdG90eXBlT2YiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuKG8odCkpfX0pfSxmdW5jdGlvbih0LGUsaSl7ZS5fX2VzTW9kdWxlPSEwO3ZhciBvPWkoNjIpLG49ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShvKTtlLmRlZmF1bHQ9ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9PSh2b2lkIDA9PT1lPyJ1bmRlZmluZWQiOigwLG4uZGVmYXVsdCkoZSkpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZS5fX2VzTW9kdWxlPSEwO3ZhciBuPWkoMTgwKSxzPW8obikscj1pKDU1KSxhPW8ociksaD1pKDYyKSxkPW8oaCk7ZS5kZWZhdWx0PWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIisodm9pZCAwPT09ZT8idW5kZWZpbmVkIjooMCxkLmRlZmF1bHQpKGUpKSk7dC5wcm90b3R5cGU9KDAsYS5kZWZhdWx0KShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKHMuZGVmYXVsdD8oMCxzLmRlZmF1bHQpKHQsZSk6dC5fX3Byb3RvX189ZSl9fSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoMTgxKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe2koMTgyKSx0LmV4cG9ydHM9aSgxNykuT2JqZWN0LnNldFByb3RvdHlwZU9mfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgxNSk7byhvLlMsIk9iamVjdCIse3NldFByb3RvdHlwZU9mOmkoMTgzKS5zZXR9KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMjMpLG49aSgyMikscz1mdW5jdGlvbih0LGUpe2lmKG4odCksIW8oZSkmJm51bGwhPT1lKXRocm93IFR5cGVFcnJvcihlKyI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhIil9O3QuZXhwb3J0cz17c2V0Ok9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbih0LGUsbyl7dHJ5e289aSgxOCkoRnVuY3Rpb24uY2FsbCxpKDc4KS5mKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIpLnNldCwyKSxvKHQsW10pLGU9ISh0IGluc3RhbmNlb2YgQXJyYXkpfWNhdGNoKHQpe2U9ITB9cmV0dXJuIGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHModCxpKSxlP3QuX19wcm90b19fPWk6byh0LGkpLHR9fSh7fSwhMSk6dm9pZCAwKSxjaGVjazpzfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDYyKSxzPW8obikscj1pKDEzNCksYT1vKHIpLGg9aSgxMzUpLGQ9byhoKSxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAsYS5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1pLHRoaXMubGFiZWxNb2R1bGU9byx0aGlzLnNldE9wdGlvbnMoZSksdGhpcy50b3A9dm9pZCAwLHRoaXMubGVmdD12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMucmFkaXVzPXZvaWQgMCx0aGlzLm1hcmdpbj12b2lkIDAsdGhpcy5yZWZyZXNoTmVlZGVkPSEwLHRoaXMuYm91bmRpbmdCb3g9e3RvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowfX1yZXR1cm4oMCxkLmRlZmF1bHQpKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fX0se2tleToiX3NldE1hcmdpbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMubWFyZ2luPXt9LHRoaXMub3B0aW9ucy5tYXJnaW4mJigib2JqZWN0Ij09KDAscy5kZWZhdWx0KSh0aGlzLm9wdGlvbnMubWFyZ2luKT8odGhpcy5tYXJnaW4udG9wPXRoaXMub3B0aW9ucy5tYXJnaW4udG9wLHRoaXMubWFyZ2luLnJpZ2h0PXRoaXMub3B0aW9ucy5tYXJnaW4ucmlnaHQsdGhpcy5tYXJnaW4uYm90dG9tPXRoaXMub3B0aW9ucy5tYXJnaW4uYm90dG9tLHRoaXMubWFyZ2luLmxlZnQ9dGhpcy5vcHRpb25zLm1hcmdpbi5sZWZ0KToodGhpcy5tYXJnaW4udG9wPXRoaXMub3B0aW9ucy5tYXJnaW4sdGhpcy5tYXJnaW4ucmlnaHQ9dGhpcy5vcHRpb25zLm1hcmdpbix0aGlzLm1hcmdpbi5ib3R0b209dGhpcy5vcHRpb25zLm1hcmdpbix0aGlzLm1hcmdpbi5sZWZ0PXRoaXMub3B0aW9ucy5tYXJnaW4pKSx0LmFkanVzdFNpemVzKHRoaXMubWFyZ2luKX19LHtrZXk6Il9kaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3B0aW9ucy5ib3JkZXJXaWR0aDtyZXR1cm4gdGhpcy5yZXNpemUodCksTWF0aC5taW4oTWF0aC5hYnModGhpcy53aWR0aC8yL01hdGguY29zKGUpKSxNYXRoLmFicyh0aGlzLmhlaWdodC8yL01hdGguc2luKGUpKSkraX19LHtrZXk6ImVuYWJsZVNoYWRvdyIsdmFsdWU6ZnVuY3Rpb24odCxlKXtlLnNoYWRvdyYmKHQuc2hhZG93Q29sb3I9ZS5zaGFkb3dDb2xvcix0LnNoYWRvd0JsdXI9ZS5zaGFkb3dTaXplLHQuc2hhZG93T2Zmc2V0WD1lLnNoYWRvd1gsdC5zaGFkb3dPZmZzZXRZPWUuc2hhZG93WSl9fSx7a2V5OiJkaXNhYmxlU2hhZG93Iix2YWx1ZTpmdW5jdGlvbih0LGUpe2Uuc2hhZG93JiYodC5zaGFkb3dDb2xvcj0icmdiYSgwLDAsMCwwKSIsdC5zaGFkb3dCbHVyPTAsdC5zaGFkb3dPZmZzZXRYPTAsdC5zaGFkb3dPZmZzZXRZPTApfX0se2tleToiZW5hYmxlQm9yZGVyRGFzaGVzIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKCExIT09ZS5ib3JkZXJEYXNoZXMpaWYodm9pZCAwIT09dC5zZXRMaW5lRGFzaCl7dmFyIGk9ZS5ib3JkZXJEYXNoZXM7ITA9PT1pJiYoaT1bNSwxNV0pLHQuc2V0TGluZURhc2goaSl9ZWxzZSBjb25zb2xlLndhcm4oInNldExpbmVEYXNoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyLiBUaGUgZGFzaGVkIGJvcmRlcnMgY2Fubm90IGJlIHVzZWQuIiksdGhpcy5vcHRpb25zLnNoYXBlUHJvcGVydGllcy5ib3JkZXJEYXNoZXM9ITEsZS5ib3JkZXJEYXNoZXM9ITF9fSx7a2V5OiJkaXNhYmxlQm9yZGVyRGFzaGVzIix2YWx1ZTpmdW5jdGlvbih0LGUpeyExIT09ZS5ib3JkZXJEYXNoZXMmJih2b2lkIDAhPT10LnNldExpbmVEYXNoP3Quc2V0TGluZURhc2goWzBdKTooY29uc29sZS53YXJuKCJzZXRMaW5lRGFzaCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3Nlci4gVGhlIGRhc2hlZCBib3JkZXJzIGNhbm5vdCBiZSB1c2VkLiIpLHRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMuYm9yZGVyRGFzaGVzPSExLGUuYm9yZGVyRGFzaGVzPSExKSl9fSx7a2V5OiJuZWVkc1JlZnJlc2giLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuITA9PT10aGlzLnJlZnJlc2hOZWVkZWQ/KHRoaXMucmVmcmVzaE5lZWRlZD0hMSwhMCk6dm9pZCAwPT09dGhpcy53aWR0aHx8dGhpcy5sYWJlbE1vZHVsZS5kaWZmZXJlbnRTdGF0ZSh0LGUpfX1dKSx0fSgpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTc1KSxzPW8obikscj1pKDEzNCksYT1vKHIpLGg9aSgxMzUpLGQ9byhoKSxsPWkoMTc4KSx1PW8obCksYz1pKDE3OSkscD1vKGMpLGY9aSgxODYpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8peygwLGEuZGVmYXVsdCkodGhpcyxlKTt2YXIgbj0oMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKTtyZXR1cm4gbi5fc2V0TWFyZ2lucyhvKSxufXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuc2VsZWN0ZWQsaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dGhpcy5ob3ZlcjtpZih0aGlzLm5lZWRzUmVmcmVzaChlLGkpKXt0aGlzLnRleHRTaXplPXRoaXMubGFiZWxNb2R1bGUuZ2V0VGV4dFNpemUodCxlLGkpO3ZhciBvPU1hdGgubWF4KHRoaXMudGV4dFNpemUud2lkdGgrdGhpcy5tYXJnaW4ucmlnaHQrdGhpcy5tYXJnaW4ubGVmdCx0aGlzLnRleHRTaXplLmhlaWdodCt0aGlzLm1hcmdpbi50b3ArdGhpcy5tYXJnaW4uYm90dG9tKTt0aGlzLm9wdGlvbnMuc2l6ZT1vLzIsdGhpcy53aWR0aD1vLHRoaXMuaGVpZ2h0PW8sdGhpcy5yYWRpdXM9dGhpcy53aWR0aC8yfX19LHtrZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLnJlc2l6ZSh0LG8sbiksdGhpcy5sZWZ0PWUtdGhpcy53aWR0aC8yLHRoaXMudG9wPWktdGhpcy5oZWlnaHQvMix0aGlzLl9kcmF3UmF3Q2lyY2xlKHQsZSxpLHMpLHRoaXMuYm91bmRpbmdCb3gudG9wPWktcy5zaXplLHRoaXMuYm91bmRpbmdCb3gubGVmdD1lLXMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PWUrcy5zaXplLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPWkrcy5zaXplLHRoaXMudXBkYXRlQm91bmRpbmdCb3goZSxpKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCx0aGlzLmxlZnQrdGhpcy50ZXh0U2l6ZS53aWR0aC8yK3RoaXMubWFyZ2luLmxlZnQsaSxvLG4pfX0se2tleToidXBkYXRlQm91bmRpbmdCb3giLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5ib3VuZGluZ0JveC50b3A9ZS10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dC10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXQrdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5ib3R0b209ZSt0aGlzLm9wdGlvbnMuc2l6ZX19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVzaXplKHQpLC41KnRoaXMud2lkdGh9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzUpLHM9byhuKSxyPWkoMTM0KSxhPW8ociksaD1pKDEzNSksZD1vKGgpLGw9aSgxNzgpLHU9byhsKSxjPWkoMTc5KSxwPW8oYyksZj1pKDE4NCksbT1vKGYpLHY9aSgxNjUpLGc9KG8odiksZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7KDAsYS5kZWZhdWx0KSh0aGlzLGUpO3ZhciBuPSgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpO3JldHVybiBuLmxhYmVsT2Zmc2V0PTAsbi5zZWxlY3RlZD0hMSxufXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLm9wdGlvbnM9dCx2b2lkIDA9PT1lJiZ2b2lkIDA9PT1pfHx0aGlzLnNldEltYWdlcyhlLGkpfX0se2tleToic2V0SW1hZ2VzIix2YWx1ZTpmdW5jdGlvbih0LGUpe2UmJnRoaXMuc2VsZWN0ZWQ/KHRoaXMuaW1hZ2VPYmo9ZSx0aGlzLmltYWdlT2JqQWx0PXQpOih0aGlzLmltYWdlT2JqPXQsdGhpcy5pbWFnZU9iakFsdD1lKX19LHtrZXk6InN3aXRjaEltYWdlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dCYmIXRoaXMuc2VsZWN0ZWR8fCF0JiZ0aGlzLnNlbGVjdGVkO2lmKHRoaXMuc2VsZWN0ZWQ9dCx2b2lkIDAhPT10aGlzLmltYWdlT2JqQWx0JiZlKXt2YXIgaT10aGlzLmltYWdlT2JqO3RoaXMuaW1hZ2VPYmo9dGhpcy5pbWFnZU9iakFsdCx0aGlzLmltYWdlT2JqQWx0PWl9fX0se2tleToiX3Jlc2l6ZUltYWdlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0LGU7aWYoITE9PT10aGlzLm9wdGlvbnMuc2hhcGVQcm9wZXJ0aWVzLnVzZUltYWdlU2l6ZSl7dmFyIGk9MSxvPTE7dGhpcy5pbWFnZU9iai53aWR0aCYmdGhpcy5pbWFnZU9iai5oZWlnaHQmJih0aGlzLmltYWdlT2JqLndpZHRoPnRoaXMuaW1hZ2VPYmouaGVpZ2h0P2k9dGhpcy5pbWFnZU9iai53aWR0aC90aGlzLmltYWdlT2JqLmhlaWdodDpvPXRoaXMuaW1hZ2VPYmouaGVpZ2h0L3RoaXMuaW1hZ2VPYmoud2lkdGgpLHQ9Mip0aGlzLm9wdGlvbnMuc2l6ZSppLGU9Mip0aGlzLm9wdGlvbnMuc2l6ZSpvfWVsc2UgdD10aGlzLmltYWdlT2JqLndpZHRoLGU9dGhpcy5pbWFnZU9iai5oZWlnaHQ7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWUsdGhpcy5yYWRpdXM9LjUqdGhpcy53aWR0aH19LHtrZXk6Il9kcmF3UmF3Q2lyY2xlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXt2YXIgbj1vLmJvcmRlcldpZHRoL3RoaXMuYm9keS52aWV3LnNjYWxlO3QubGluZVdpZHRoPU1hdGgubWluKHRoaXMud2lkdGgsbiksdC5zdHJva2VTdHlsZT1vLmJvcmRlckNvbG9yLHQuZmlsbFN0eWxlPW8uY29sb3IsdC5jaXJjbGUoZSxpLG8uc2l6ZSksdGhpcy5lbmFibGVTaGFkb3codCxvKSx0LmZpbGwoKSx0aGlzLmRpc2FibGVTaGFkb3codCxvKSx0LnNhdmUoKSxuPjAmJih0aGlzLmVuYWJsZUJvcmRlckRhc2hlcyh0LG8pLHQuc3Ryb2tlKCksdGhpcy5kaXNhYmxlQm9yZGVyRGFzaGVzKHQsbykpLHQucmVzdG9yZSgpfX0se2tleToiX2RyYXdJbWFnZUF0UG9zaXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoMCE9dGhpcy5pbWFnZU9iai53aWR0aCl7dC5nbG9iYWxBbHBoYT0xLHRoaXMuZW5hYmxlU2hhZG93KHQsZSk7dmFyIGk9MTshMD09PXRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMuaW50ZXJwb2xhdGlvbiYmKGk9dGhpcy5pbWFnZU9iai53aWR0aC90aGlzLndpZHRoL3RoaXMuYm9keS52aWV3LnNjYWxlKSx0aGlzLmltYWdlT2JqLmRyYXdJbWFnZUF0UG9zaXRpb24odCxpLHRoaXMubGVmdCx0aGlzLnRvcCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLmRpc2FibGVTaGFkb3codCxlKX19fSx7a2V5OiJfZHJhd0ltYWdlTGFiZWwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7dmFyIHMscj0wO2lmKHZvaWQgMCE9PXRoaXMuaGVpZ2h0KXtyPS41KnRoaXMuaGVpZ2h0O3ZhciBhPXRoaXMubGFiZWxNb2R1bGUuZ2V0VGV4dFNpemUodCxvLG4pO2EubGluZUNvdW50Pj0xJiYocis9YS5oZWlnaHQvMil9cz1pK3IsdGhpcy5vcHRpb25zLmxhYmVsJiYodGhpcy5sYWJlbE9mZnNldD1yKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCxlLHMsbyxuLCJoYW5naW5nIil9fV0pLGV9KG0uZGVmYXVsdCkpO2UuZGVmYXVsdD1nfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTc1KSxzPW8obikscj1pKDEzNCksYT1vKHIpLGg9aSgxMzUpLGQ9byhoKSxsPWkoMTc4KSx1PW8obCksYz1pKDE3OSkscD1vKGMpLGY9aSgxODYpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8sbixyKXsoMCxhLmRlZmF1bHQpKHRoaXMsZSk7dmFyIGg9KDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSk7cmV0dXJuIGguc2V0SW1hZ2VzKG4sciksaH1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OiJyZXNpemUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLnNlbGVjdGVkLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnRoaXMuaG92ZXI7aWYodm9pZCAwPT09dGhpcy5pbWFnZU9iai5zcmN8fHZvaWQgMD09PXRoaXMuaW1hZ2VPYmoud2lkdGh8fHZvaWQgMD09PXRoaXMuaW1hZ2VPYmouaGVpZ2h0KXt2YXIgbz0yKnRoaXMub3B0aW9ucy5zaXplO3JldHVybiB0aGlzLndpZHRoPW8sdGhpcy5oZWlnaHQ9byx2b2lkKHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGgpfXRoaXMubmVlZHNSZWZyZXNoKGUsaSkmJnRoaXMuX3Jlc2l6ZUltYWdlKCl9fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5zd2l0Y2hJbWFnZXMobyksdGhpcy5yZXNpemUoKSx0aGlzLmxlZnQ9ZS10aGlzLndpZHRoLzIsdGhpcy50b3A9aS10aGlzLmhlaWdodC8yLHRoaXMuX2RyYXdSYXdDaXJjbGUodCxlLGkscyksdC5zYXZlKCksdC5jbGlwKCksdGhpcy5fZHJhd0ltYWdlQXRQb3NpdGlvbih0LHMpLHQucmVzdG9yZSgpLHRoaXMuX2RyYXdJbWFnZUxhYmVsKHQsZSxpLG8sbiksdGhpcy51cGRhdGVCb3VuZGluZ0JveChlLGkpfX0se2tleToidXBkYXRlQm91bmRpbmdCb3giLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5ib3VuZGluZ0JveC50b3A9ZS10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dC10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXQrdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5ib3R0b209ZSt0aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9TWF0aC5taW4odGhpcy5ib3VuZGluZ0JveC5sZWZ0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0KSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PU1hdGgubWF4KHRoaXMuYm91bmRpbmdCb3gucmlnaHQsdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQrdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoKSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSt0aGlzLmxhYmVsT2Zmc2V0KX19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVzaXplKHQpLC41KnRoaXMud2lkdGh9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzUpLHM9byhuKSxyPWkoMTM0KSxhPW8ociksaD1pKDEzNSksZD1vKGgpLGw9aSgxNzgpLHU9byhsKSxjPWkoMTc5KSxwPW8oYyksZj1pKDE4NCksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7KDAsYS5kZWZhdWx0KSh0aGlzLGUpO3ZhciBuPSgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpO3JldHVybiBuLl9zZXRNYXJnaW5zKG8pLG59cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleToicmVzaXplIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7aWYodGhpcy5uZWVkc1JlZnJlc2goZSxpKSl7dGhpcy50ZXh0U2l6ZT10aGlzLmxhYmVsTW9kdWxlLmdldFRleHRTaXplKHQsZSxpKTt2YXIgbz10aGlzLnRleHRTaXplLndpZHRoK3RoaXMubWFyZ2luLnJpZ2h0K3RoaXMubWFyZ2luLmxlZnQ7dGhpcy53aWR0aD1vLHRoaXMuaGVpZ2h0PW8sdGhpcy5yYWRpdXM9dGhpcy53aWR0aC8yfX19LHtrZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLnJlc2l6ZSh0LG8sbiksdGhpcy5sZWZ0PWUtdGhpcy53aWR0aC8yLHRoaXMudG9wPWktdGhpcy5oZWlnaHQvMjt2YXIgcj1zLmJvcmRlcldpZHRoL3RoaXMuYm9keS52aWV3LnNjYWxlO3QubGluZVdpZHRoPU1hdGgubWluKHRoaXMud2lkdGgsciksdC5zdHJva2VTdHlsZT1zLmJvcmRlckNvbG9yLHQuZmlsbFN0eWxlPXMuY29sb3IsdC5kYXRhYmFzZShlLXRoaXMud2lkdGgvMixpLXRoaXMuaGVpZ2h0LzIsdGhpcy53aWR0aCx0aGlzLmhlaWdodCksdGhpcy5lbmFibGVTaGFkb3codCxzKSx0LmZpbGwoKSx0aGlzLmRpc2FibGVTaGFkb3codCxzKSx0LnNhdmUoKSxyPjAmJih0aGlzLmVuYWJsZUJvcmRlckRhc2hlcyh0LHMpLHQuc3Ryb2tlKCksdGhpcy5kaXNhYmxlQm9yZGVyRGFzaGVzKHQscykpLHQucmVzdG9yZSgpLHRoaXMudXBkYXRlQm91bmRpbmdCb3goZSxpLHQsbyxuKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCx0aGlzLmxlZnQrdGhpcy50ZXh0U2l6ZS53aWR0aC8yK3RoaXMubWFyZ2luLmxlZnQsdGhpcy50b3ArdGhpcy50ZXh0U2l6ZS5oZWlnaHQvMit0aGlzLm1hcmdpbi50b3AsbyxuKX19LHtrZXk6InVwZGF0ZUJvdW5kaW5nQm94Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3RoaXMucmVzaXplKGksbyxuKSx0aGlzLmxlZnQ9dC0uNSp0aGlzLndpZHRoLHRoaXMudG9wPWUtLjUqdGhpcy5oZWlnaHQsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PXRoaXMubGVmdCx0aGlzLmJvdW5kaW5nQm94LnRvcD10aGlzLnRvcCx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT10aGlzLnRvcCt0aGlzLmhlaWdodCx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXRoaXMubGVmdCt0aGlzLndpZHRofX0se2tleToiZGlzdGFuY2VUb0JvcmRlciIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTc1KSxzPW8obikscj1pKDEzNCksYT1vKHIpLGg9aSgxMzUpLGQ9byhoKSxsPWkoMTc4KSx1PW8obCksYz1pKDE3OSkscD1vKGMpLGY9aSgxOTApLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybigwLGEuZGVmYXVsdCkodGhpcyxlKSwoMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5fZHJhd1NoYXBlKHQsImRpYW1vbmQiLDQsZSxpLG8sbixzKX19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDE3NSkscz1vKG4pLHI9aSgxMzQpLGE9byhyKSxoPWkoMTM1KSxkPW8oaCksbD1pKDE3OCksdT1vKGwpLGM9aSgxNzkpLHA9byhjKSxmPWkoMTg0KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleToicmVzaXplIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5zZWxlY3RlZCxpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp0aGlzLmhvdmVyLG89YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOntzaXplOnRoaXMub3B0aW9ucy5zaXplfTtpZih0aGlzLm5lZWRzUmVmcmVzaChlLGkpKXt0aGlzLmxhYmVsTW9kdWxlLmdldFRleHRTaXplKHQsZSxpKTt2YXIgbj0yKm8uc2l6ZTt0aGlzLndpZHRoPW4sdGhpcy5oZWlnaHQ9bix0aGlzLnJhZGl1cz0uNSp0aGlzLndpZHRofX19LHtrZXk6Il9kcmF3U2hhcGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzLHIsYSl7dGhpcy5yZXNpemUodCxzLHIsYSksdGhpcy5sZWZ0PW8tdGhpcy53aWR0aC8yLHRoaXMudG9wPW4tdGhpcy5oZWlnaHQvMjt2YXIgaD1hLmJvcmRlcldpZHRoL3RoaXMuYm9keS52aWV3LnNjYWxlO2lmKHQubGluZVdpZHRoPU1hdGgubWluKHRoaXMud2lkdGgsaCksdC5zdHJva2VTdHlsZT1hLmJvcmRlckNvbG9yLHQuZmlsbFN0eWxlPWEuY29sb3IsdFtlXShvLG4sYS5zaXplKSx0aGlzLmVuYWJsZVNoYWRvdyh0LGEpLHQuZmlsbCgpLHRoaXMuZGlzYWJsZVNoYWRvdyh0LGEpLHQuc2F2ZSgpLGg+MCYmKHRoaXMuZW5hYmxlQm9yZGVyRGFzaGVzKHQsYSksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVCb3JkZXJEYXNoZXModCxhKSksdC5yZXN0b3JlKCksdm9pZCAwIT09dGhpcy5vcHRpb25zLmxhYmVsKXt0aGlzLmxhYmVsTW9kdWxlLmNhbGN1bGF0ZUxhYmVsU2l6ZSh0LHMscixvLG4sImhhbmdpbmciKTt2YXIgZD1uKy41KnRoaXMuaGVpZ2h0Ky41KnRoaXMubGFiZWxNb2R1bGUuc2l6ZS5oZWlnaHQ7dGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQsbyxkLHMsciwiaGFuZ2luZyIpfXRoaXMudXBkYXRlQm91bmRpbmdCb3gobyxuKX19LHtrZXk6InVwZGF0ZUJvdW5kaW5nQm94Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuYm91bmRpbmdCb3gudG9wPWUtdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PXQtdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5yaWdodD10K3RoaXMub3B0aW9ucy5zaXplLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPWUrdGhpcy5vcHRpb25zLnNpemUsdm9pZCAwIT09dGhpcy5vcHRpb25zLmxhYmVsJiZ0aGlzLmxhYmVsTW9kdWxlLnNpemUud2lkdGg+MCYmKHRoaXMuYm91bmRpbmdCb3gubGVmdD1NYXRoLm1pbih0aGlzLmJvdW5kaW5nQm94LmxlZnQsdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQpLHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9TWF0aC5tYXgodGhpcy5ib3VuZGluZ0JveC5yaWdodCx0aGlzLmxhYmVsTW9kdWxlLnNpemUubGVmdCt0aGlzLmxhYmVsTW9kdWxlLnNpemUud2lkdGgpLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPU1hdGgubWF4KHRoaXMuYm91bmRpbmdCb3guYm90dG9tLHRoaXMuYm91bmRpbmdCb3guYm90dG9tK3RoaXMubGFiZWxNb2R1bGUuc2l6ZS5oZWlnaHQpKX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDE3NSkscz1vKG4pLHI9aSgxMzQpLGE9byhyKSxoPWkoMTM1KSxkPW8oaCksbD1pKDE3OCksdT1vKGwpLGM9aSgxNzkpLHA9byhjKSxmPWkoMTkwKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe3RoaXMuX2RyYXdTaGFwZSh0LCJjaXJjbGUiLDIsZSxpLG8sbixzKX19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVzaXplKHQpLHRoaXMub3B0aW9ucy5zaXplfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTc1KSxzPW8obikscj1pKDEzNCksYT1vKHIpLGg9aSgxMzUpLGQ9byhoKSxsPWkoMTc4KSx1PW8obCksYz1pKDE3OSkscD1vKGMpLGY9aSgxODQpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybigwLGEuZGVmYXVsdCkodGhpcyxlKSwoMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OiJyZXNpemUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLnNlbGVjdGVkLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnRoaXMuaG92ZXI7aWYodGhpcy5uZWVkc1JlZnJlc2goZSxpKSl7dmFyIG89dGhpcy5sYWJlbE1vZHVsZS5nZXRUZXh0U2l6ZSh0LGUsaSk7dGhpcy5oZWlnaHQ9MipvLmhlaWdodCx0aGlzLndpZHRoPW8ud2lkdGgrdGhpcy5oZWlnaHQsdGhpcy5yYWRpdXM9LjUqdGhpcy53aWR0aH19fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7CnRoaXMucmVzaXplKHQsbyxuKSx0aGlzLmxlZnQ9ZS0uNSp0aGlzLndpZHRoLHRoaXMudG9wPWktLjUqdGhpcy5oZWlnaHQ7dmFyIHI9cy5ib3JkZXJXaWR0aC90aGlzLmJvZHkudmlldy5zY2FsZTt0LmxpbmVXaWR0aD1NYXRoLm1pbih0aGlzLndpZHRoLHIpLHQuc3Ryb2tlU3R5bGU9cy5ib3JkZXJDb2xvcix0LmZpbGxTdHlsZT1zLmNvbG9yLHQuZWxsaXBzZV92aXModGhpcy5sZWZ0LHRoaXMudG9wLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMuZW5hYmxlU2hhZG93KHQscyksdC5maWxsKCksdGhpcy5kaXNhYmxlU2hhZG93KHQscyksdC5zYXZlKCkscj4wJiYodGhpcy5lbmFibGVCb3JkZXJEYXNoZXModCxzKSx0LnN0cm9rZSgpLHRoaXMuZGlzYWJsZUJvcmRlckRhc2hlcyh0LHMpKSx0LnJlc3RvcmUoKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSx0LG8sbiksdGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQsZSxpLG8sbil9fSx7a2V5OiJ1cGRhdGVCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt0aGlzLnJlc2l6ZShpLG8sbiksdGhpcy5sZWZ0PXQtLjUqdGhpcy53aWR0aCx0aGlzLnRvcD1lLS41KnRoaXMuaGVpZ2h0LHRoaXMuYm91bmRpbmdCb3gubGVmdD10aGlzLmxlZnQsdGhpcy5ib3VuZGluZ0JveC50b3A9dGhpcy50b3AsdGhpcy5ib3VuZGluZ0JveC5ib3R0b209dGhpcy50b3ArdGhpcy5oZWlnaHQsdGhpcy5ib3VuZGluZ0JveC5yaWdodD10aGlzLmxlZnQrdGhpcy53aWR0aH19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5yZXNpemUodCk7dmFyIGk9LjUqdGhpcy53aWR0aCxvPS41KnRoaXMuaGVpZ2h0LG49TWF0aC5zaW4oZSkqaSxzPU1hdGguY29zKGUpKm87cmV0dXJuIGkqby9NYXRoLnNxcnQobipuK3Mqcyl9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzUpLHM9byhuKSxyPWkoMTM0KSxhPW8ociksaD1pKDEzNSksZD1vKGgpLGw9aSgxNzgpLHU9byhsKSxjPWkoMTc5KSxwPW8oYyksZj1pKDE4NCksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7KDAsYS5kZWZhdWx0KSh0aGlzLGUpO3ZhciBuPSgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpO3JldHVybiBuLl9zZXRNYXJnaW5zKG8pLG59cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleToicmVzaXplIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dGhpcy5uZWVkc1JlZnJlc2goZSxpKSYmKHRoaXMuaWNvblNpemU9e3dpZHRoOk51bWJlcih0aGlzLm9wdGlvbnMuaWNvbi5zaXplKSxoZWlnaHQ6TnVtYmVyKHRoaXMub3B0aW9ucy5pY29uLnNpemUpfSx0aGlzLndpZHRoPXRoaXMuaWNvblNpemUud2lkdGgrdGhpcy5tYXJnaW4ucmlnaHQrdGhpcy5tYXJnaW4ubGVmdCx0aGlzLmhlaWdodD10aGlzLmljb25TaXplLmhlaWdodCt0aGlzLm1hcmdpbi50b3ArdGhpcy5tYXJnaW4uYm90dG9tLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGgpfX0se2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe2lmKHRoaXMucmVzaXplKHQsbyxuKSx0aGlzLm9wdGlvbnMuaWNvbi5zaXplPXRoaXMub3B0aW9ucy5pY29uLnNpemV8fDUwLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5faWNvbih0LGUsaSxvLG4scyksdm9pZCAwIT09dGhpcy5vcHRpb25zLmxhYmVsKXt0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCx0aGlzLmxlZnQrdGhpcy5pY29uU2l6ZS53aWR0aC8yK3RoaXMubWFyZ2luLmxlZnQsaSt0aGlzLmhlaWdodC8yKzUsbyl9dGhpcy51cGRhdGVCb3VuZGluZ0JveChlLGkpfX0se2tleToidXBkYXRlQm91bmRpbmdCb3giLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5ib3VuZGluZ0JveC50b3A9ZS0uNSp0aGlzLm9wdGlvbnMuaWNvbi5zaXplLHRoaXMuYm91bmRpbmdCb3gubGVmdD10LS41KnRoaXMub3B0aW9ucy5pY29uLnNpemUsdGhpcy5ib3VuZGluZ0JveC5yaWdodD10Ky41KnRoaXMub3B0aW9ucy5pY29uLnNpemUsdGhpcy5ib3VuZGluZ0JveC5ib3R0b209ZSsuNSp0aGlzLm9wdGlvbnMuaWNvbi5zaXplLHZvaWQgMCE9PXRoaXMub3B0aW9ucy5sYWJlbCYmdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoPjApe3RoaXMuYm91bmRpbmdCb3gubGVmdD1NYXRoLm1pbih0aGlzLmJvdW5kaW5nQm94LmxlZnQsdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQpLHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9TWF0aC5tYXgodGhpcy5ib3VuZGluZ0JveC5yaWdodCx0aGlzLmxhYmVsTW9kdWxlLnNpemUubGVmdCt0aGlzLmxhYmVsTW9kdWxlLnNpemUud2lkdGgpLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPU1hdGgubWF4KHRoaXMuYm91bmRpbmdCb3guYm90dG9tLHRoaXMuYm91bmRpbmdCb3guYm90dG9tK3RoaXMubGFiZWxNb2R1bGUuc2l6ZS5oZWlnaHQrNSl9fX0se2tleToiX2ljb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt2YXIgcj1OdW1iZXIodGhpcy5vcHRpb25zLmljb24uc2l6ZSk7dm9pZCAwIT09dGhpcy5vcHRpb25zLmljb24uY29kZT8odC5mb250PShvPyJib2xkICI6IiIpK3IrInB4ICIrdGhpcy5vcHRpb25zLmljb24uZmFjZSx0LmZpbGxTdHlsZT10aGlzLm9wdGlvbnMuaWNvbi5jb2xvcnx8ImJsYWNrIix0LnRleHRBbGlnbj0iY2VudGVyIix0LnRleHRCYXNlbGluZT0ibWlkZGxlIix0aGlzLmVuYWJsZVNoYWRvdyh0LHMpLHQuZmlsbFRleHQodGhpcy5vcHRpb25zLmljb24uY29kZSxlLGkpLHRoaXMuZGlzYWJsZVNoYWRvdyh0LHMpKTpjb25zb2xlLmVycm9yKCJXaGVuIHVzaW5nIHRoZSBpY29uIHNoYXBlLCB5b3UgbmVlZCB0byBkZWZpbmUgdGhlIGNvZGUgaW4gdGhlIGljb24gb3B0aW9ucyBvYmplY3QuIFRoaXMgY2FuIGJlIGRvbmUgcGVyIG5vZGUgb3IgZ2xvYmFsbHkuIil9fSx7a2V5OiJkaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kaXN0YW5jZVRvQm9yZGVyKHQsZSl9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzUpLHM9byhuKSxyPWkoMTM0KSxhPW8ociksaD1pKDEzNSksZD1vKGgpLGw9aSgxNzgpLHU9byhsKSxjPWkoMTc5KSxwPW8oYyksZj1pKDE4NiksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyxuLHIpeygwLGEuZGVmYXVsdCkodGhpcyxlKTt2YXIgaD0oMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKTtyZXR1cm4gaC5zZXRJbWFnZXMobixyKSxofXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuc2VsZWN0ZWQsaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dGhpcy5ob3Zlcjt0aGlzLm5lZWRzUmVmcmVzaChlLGkpJiZ0aGlzLl9yZXNpemVJbWFnZSgpfX0se2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe2lmKHRoaXMuc3dpdGNoSW1hZ2VzKG8pLHRoaXMucmVzaXplKCksdGhpcy5sZWZ0PWUtdGhpcy53aWR0aC8yLHRoaXMudG9wPWktdGhpcy5oZWlnaHQvMiwhMD09PXRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMudXNlQm9yZGVyV2l0aEltYWdlKXt2YXIgcj10aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGgsYT10aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGhTZWxlY3RlZHx8Mip0aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGgsaD0obz9hOnIpL3RoaXMuYm9keS52aWV3LnNjYWxlO3QubGluZVdpZHRoPU1hdGgubWluKHRoaXMud2lkdGgsaCksdC5iZWdpblBhdGgoKSx0LnN0cm9rZVN0eWxlPW8/dGhpcy5vcHRpb25zLmNvbG9yLmhpZ2hsaWdodC5ib3JkZXI6bj90aGlzLm9wdGlvbnMuY29sb3IuaG92ZXIuYm9yZGVyOnRoaXMub3B0aW9ucy5jb2xvci5ib3JkZXIsdC5maWxsU3R5bGU9bz90aGlzLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJhY2tncm91bmQ6bj90aGlzLm9wdGlvbnMuY29sb3IuaG92ZXIuYmFja2dyb3VuZDp0aGlzLm9wdGlvbnMuY29sb3IuYmFja2dyb3VuZCx0LnJlY3QodGhpcy5sZWZ0LS41KnQubGluZVdpZHRoLHRoaXMudG9wLS41KnQubGluZVdpZHRoLHRoaXMud2lkdGgrdC5saW5lV2lkdGgsdGhpcy5oZWlnaHQrdC5saW5lV2lkdGgpLHQuZmlsbCgpLHQuc2F2ZSgpLGg+MCYmKHRoaXMuZW5hYmxlQm9yZGVyRGFzaGVzKHQscyksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVCb3JkZXJEYXNoZXModCxzKSksdC5yZXN0b3JlKCksdC5jbG9zZVBhdGgoKX10aGlzLl9kcmF3SW1hZ2VBdFBvc2l0aW9uKHQscyksdGhpcy5fZHJhd0ltYWdlTGFiZWwodCxlLGksbyxuKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSl9fSx7a2V5OiJ1cGRhdGVCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLnJlc2l6ZSgpLHRoaXMubGVmdD10LXRoaXMud2lkdGgvMix0aGlzLnRvcD1lLXRoaXMuaGVpZ2h0LzIsdGhpcy5ib3VuZGluZ0JveC50b3A9dGhpcy50b3AsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PXRoaXMubGVmdCx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXRoaXMubGVmdCt0aGlzLndpZHRoLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPXRoaXMudG9wK3RoaXMuaGVpZ2h0LHZvaWQgMCE9PXRoaXMub3B0aW9ucy5sYWJlbCYmdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoPjAmJih0aGlzLmJvdW5kaW5nQm94LmxlZnQ9TWF0aC5taW4odGhpcy5ib3VuZGluZ0JveC5sZWZ0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0KSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PU1hdGgubWF4KHRoaXMuYm91bmRpbmdCb3gucmlnaHQsdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQrdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoKSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSt0aGlzLmxhYmVsT2Zmc2V0KSl9fSx7a2V5OiJkaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kaXN0YW5jZVRvQm9yZGVyKHQsZSl9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzUpLHM9byhuKSxyPWkoMTM0KSxhPW8ociksaD1pKDEzNSksZD1vKGgpLGw9aSgxNzgpLHU9byhsKSxjPWkoMTc5KSxwPW8oYyksZj1pKDE5MCksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLl9kcmF3U2hhcGUodCwic3F1YXJlIiwyLGUsaSxvLG4scyl9fSx7a2V5OiJkaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kaXN0YW5jZVRvQm9yZGVyKHQsZSl9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzUpLHM9byhuKSxyPWkoMTM0KSxhPW8ociksaD1pKDEzNSksZD1vKGgpLGw9aSgxNzgpLHU9byhsKSxjPWkoMTc5KSxwPW8oYyksZj1pKDE5MCksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLl9kcmF3U2hhcGUodCwic3RhciIsNCxlLGksbyxuLHMpfX0se2tleToiZGlzdGFuY2VUb0JvcmRlciIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTc1KSxzPW8obikscj1pKDEzNCksYT1vKHIpLGg9aSgxMzUpLGQ9byhoKSxsPWkoMTc4KSx1PW8obCksYz1pKDE3OSkscD1vKGMpLGY9aSgxODQpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8peygwLGEuZGVmYXVsdCkodGhpcyxlKTt2YXIgbj0oMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKTtyZXR1cm4gbi5fc2V0TWFyZ2lucyhvKSxufXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3RoaXMubmVlZHNSZWZyZXNoKGUsaSkmJih0aGlzLnRleHRTaXplPXRoaXMubGFiZWxNb2R1bGUuZ2V0VGV4dFNpemUodCxlLGkpLHRoaXMud2lkdGg9dGhpcy50ZXh0U2l6ZS53aWR0aCt0aGlzLm1hcmdpbi5yaWdodCt0aGlzLm1hcmdpbi5sZWZ0LHRoaXMuaGVpZ2h0PXRoaXMudGV4dFNpemUuaGVpZ2h0K3RoaXMubWFyZ2luLnRvcCt0aGlzLm1hcmdpbi5ib3R0b20sdGhpcy5yYWRpdXM9LjUqdGhpcy53aWR0aCl9fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5yZXNpemUodCxvLG4pLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5lbmFibGVTaGFkb3codCxzKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCx0aGlzLmxlZnQrdGhpcy50ZXh0U2l6ZS53aWR0aC8yK3RoaXMubWFyZ2luLmxlZnQsdGhpcy50b3ArdGhpcy50ZXh0U2l6ZS5oZWlnaHQvMit0aGlzLm1hcmdpbi50b3AsbyxuKSx0aGlzLmRpc2FibGVTaGFkb3codCxzKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSx0LG8sbil9fSx7a2V5OiJ1cGRhdGVCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt0aGlzLnJlc2l6ZShpLG8sbiksdGhpcy5sZWZ0PXQtdGhpcy53aWR0aC8yLHRoaXMudG9wPWUtdGhpcy5oZWlnaHQvMix0aGlzLmJvdW5kaW5nQm94LnRvcD10aGlzLnRvcCx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dGhpcy5sZWZ0LHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9dGhpcy5sZWZ0K3RoaXMud2lkdGgsdGhpcy5ib3VuZGluZ0JveC5ib3R0b209dGhpcy50b3ArdGhpcy5oZWlnaHR9fSx7a2V5OiJkaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kaXN0YW5jZVRvQm9yZGVyKHQsZSl9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzUpLHM9byhuKSxyPWkoMTM0KSxhPW8ociksaD1pKDEzNSksZD1vKGgpLGw9aSgxNzgpLHU9byhsKSxjPWkoMTc5KSxwPW8oYyksZj1pKDE5MCksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLl9kcmF3U2hhcGUodCwidHJpYW5nbGUiLDMsZSxpLG8sbixzKX19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDE3NSkscz1vKG4pLHI9aSgxMzQpLGE9byhyKSxoPWkoMTM1KSxkPW8oaCksbD1pKDE3OCksdT1vKGwpLGM9aSgxNzkpLHA9byhjKSxmPWkoMTkwKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe3RoaXMuX2RyYXdTaGFwZSh0LCJ0cmlhbmdsZURvd24iLDMsZSxpLG8sbixzKX19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDEzNCkscz1vKG4pLHI9aSgxMzUpLGE9byhyKSxoPWkoMSksZD1pKDg5KSxsPWkoOTMpLHU9aSgyMDEpLmRlZmF1bHQsYz1pKDE2OSkuZGVmYXVsdCxwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7dmFyIG49dGhpczsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5pbWFnZXM9aSx0aGlzLmdyb3Vwcz1vLHRoaXMuYm9keS5mdW5jdGlvbnMuY3JlYXRlRWRnZT10aGlzLmNyZWF0ZS5iaW5kKHRoaXMpLHRoaXMuZWRnZXNMaXN0ZW5lcnM9e2FkZDpmdW5jdGlvbih0LGUpe24uYWRkKGUuaXRlbXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXtuLnVwZGF0ZShlLml0ZW1zKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7bi5yZW1vdmUoZS5pdGVtcyl9fSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17YXJyb3dzOnt0bzp7ZW5hYmxlZDohMSxzY2FsZUZhY3RvcjoxLHR5cGU6ImFycm93In0sbWlkZGxlOntlbmFibGVkOiExLHNjYWxlRmFjdG9yOjEsdHlwZToiYXJyb3cifSxmcm9tOntlbmFibGVkOiExLHNjYWxlRmFjdG9yOjEsdHlwZToiYXJyb3cifX0sYXJyb3dTdHJpa2V0aHJvdWdoOiEwLGNvbG9yOntjb2xvcjoiIzg0ODQ4NCIsaGlnaGxpZ2h0OiIjODQ4NDg0Iixob3ZlcjoiIzg0ODQ4NCIsaW5oZXJpdDoiZnJvbSIsb3BhY2l0eToxfSxkYXNoZXM6ITEsZm9udDp7Y29sb3I6IiMzNDM0MzQiLHNpemU6MTQsZmFjZToiYXJpYWwiLGJhY2tncm91bmQ6Im5vbmUiLHN0cm9rZVdpZHRoOjIsc3Ryb2tlQ29sb3I6IiNmZmZmZmYiLGFsaWduOiJob3Jpem9udGFsIixtdWx0aTohMSx2YWRqdXN0OjAsYm9sZDp7bW9kOiJib2xkIn0sYm9sZGl0YWw6e21vZDoiYm9sZCBpdGFsaWMifSxpdGFsOnttb2Q6Iml0YWxpYyJ9LG1vbm86e21vZDoiIixzaXplOjE1LGZhY2U6ImNvdXJpZXIgbmV3Iix2YWRqdXN0OjJ9fSxoaWRkZW46ITEsaG92ZXJXaWR0aDoxLjUsbGFiZWw6dm9pZCAwLGxhYmVsSGlnaGxpZ2h0Qm9sZDohMCxsZW5ndGg6dm9pZCAwLHBoeXNpY3M6ITAsc2NhbGluZzp7bWluOjEsbWF4OjE1LGxhYmVsOntlbmFibGVkOiEwLG1pbjoxNCxtYXg6MzAsbWF4VmlzaWJsZTozMCxkcmF3VGhyZXNob2xkOjV9LGN1c3RvbVNjYWxpbmdGdW5jdGlvbjpmdW5jdGlvbih0LGUsaSxvKXtpZihlPT09dClyZXR1cm4uNTt2YXIgbj0xLyhlLXQpO3JldHVybiBNYXRoLm1heCgwLChvLXQpKm4pfX0sc2VsZWN0aW9uV2lkdGg6MS41LHNlbGZSZWZlcmVuY2VTaXplOjIwLHNoYWRvdzp7ZW5hYmxlZDohMSxjb2xvcjoicmdiYSgwLDAsMCwwLjUpIixzaXplOjEwLHg6NSx5OjV9LHNtb290aDp7ZW5hYmxlZDohMCx0eXBlOiJkeW5hbWljIixmb3JjZURpcmVjdGlvbjoibm9uZSIscm91bmRuZXNzOi41fSx0aXRsZTp2b2lkIDAsd2lkdGg6MSx2YWx1ZTp2b2lkIDB9LGguZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmJpbmRFdmVudExpc3RlbmVycygpfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleToiYmluZEV2ZW50TGlzdGVuZXJzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub24oIl9mb3JjZURpc2FibGVEeW5hbWljQ3VydmVzIixmdW5jdGlvbihlKXsiZHluYW1pYyI9PT1lJiYoZT0iY29udGludW91cyIpO3ZhciBpPSExO2Zvcih2YXIgbyBpbiB0LmJvZHkuZWRnZXMpaWYodC5ib2R5LmVkZ2VzLmhhc093blByb3BlcnR5KG8pKXt2YXIgbj10LmJvZHkuZWRnZXNbb10scz10LmJvZHkuZGF0YS5lZGdlcy5fZGF0YVtvXTtpZih2b2lkIDAhPT1zKXt2YXIgcj1zLnNtb290aDt2b2lkIDAhPT1yJiYhMD09PXIuZW5hYmxlZCYmImR5bmFtaWMiPT09ci50eXBlJiYodm9pZCAwPT09ZT9uLnNldE9wdGlvbnMoe3Ntb290aDohMX0pOm4uc2V0T3B0aW9ucyh7c21vb3RoOnt0eXBlOmV9fSksaT0hMCl9fSEwPT09aSYmdC5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIil9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX2RhdGFVcGRhdGVkIixmdW5jdGlvbigpe3QucmVjb25uZWN0RWRnZXMoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJyZWZyZXNoRWRnZXMiLHRoaXMucmVmcmVzaC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbigicmVmcmVzaCIsdGhpcy5yZWZyZXNoLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJkZXN0cm95IixmdW5jdGlvbigpe2guZm9yRWFjaCh0LmVkZ2VzTGlzdGVuZXJzLGZ1bmN0aW9uKGUsaSl7dC5ib2R5LmRhdGEuZWRnZXMmJnQuYm9keS5kYXRhLmVkZ2VzLm9mZihpLGUpfSksZGVsZXRlIHQuYm9keS5mdW5jdGlvbnMuY3JlYXRlRWRnZSxkZWxldGUgdC5lZGdlc0xpc3RlbmVycy5hZGQsZGVsZXRlIHQuZWRnZXNMaXN0ZW5lcnMudXBkYXRlLGRlbGV0ZSB0LmVkZ2VzTGlzdGVuZXJzLnJlbW92ZSxkZWxldGUgdC5lZGdlc0xpc3RlbmVyc30pfX0se2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5lZGdlT3B0aW9ucz10LHZvaWQgMCE9PXQpe3UucGFyc2VPcHRpb25zKHRoaXMub3B0aW9ucyx0KTt2YXIgZT0hMTtpZih2b2lkIDAhPT10LnNtb290aClmb3IodmFyIGkgaW4gdGhpcy5ib2R5LmVkZ2VzKXRoaXMuYm9keS5lZGdlcy5oYXNPd25Qcm9wZXJ0eShpKSYmKGU9dGhpcy5ib2R5LmVkZ2VzW2ldLnVwZGF0ZUVkZ2VUeXBlKCl8fGUpO2lmKHZvaWQgMCE9PXQuZm9udCl7Yy5wYXJzZU9wdGlvbnModGhpcy5vcHRpb25zLmZvbnQsdCk7Zm9yKHZhciBvIGluIHRoaXMuYm9keS5lZGdlcyl0aGlzLmJvZHkuZWRnZXMuaGFzT3duUHJvcGVydHkobykmJnRoaXMuYm9keS5lZGdlc1tvXS51cGRhdGVMYWJlbE1vZHVsZSgpfXZvaWQgMD09PXQuaGlkZGVuJiZ2b2lkIDA9PT10LnBoeXNpY3MmJiEwIT09ZXx8dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIil9fX0se2tleToic2V0RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0sbz10aGlzLmJvZHkuZGF0YS5lZGdlcztpZih0IGluc3RhbmNlb2YgZHx8dCBpbnN0YW5jZW9mIGwpdGhpcy5ib2R5LmRhdGEuZWRnZXM9dDtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpdGhpcy5ib2R5LmRhdGEuZWRnZXM9bmV3IGQsdGhpcy5ib2R5LmRhdGEuZWRnZXMuYWRkKHQpO2Vsc2V7aWYodCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBvciBEYXRhU2V0IGV4cGVjdGVkIik7dGhpcy5ib2R5LmRhdGEuZWRnZXM9bmV3IGR9aWYobyYmaC5mb3JFYWNoKHRoaXMuZWRnZXNMaXN0ZW5lcnMsZnVuY3Rpb24odCxlKXtvLm9mZihlLHQpfSksdGhpcy5ib2R5LmVkZ2VzPXt9LHRoaXMuYm9keS5kYXRhLmVkZ2VzKXtoLmZvckVhY2godGhpcy5lZGdlc0xpc3RlbmVycyxmdW5jdGlvbih0LGkpe2UuYm9keS5kYXRhLmVkZ2VzLm9uKGksdCl9KTt2YXIgbj10aGlzLmJvZHkuZGF0YS5lZGdlcy5nZXRJZHMoKTt0aGlzLmFkZChuLCEwKX0hMT09PWkmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToiYWRkIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxpPXRoaXMuYm9keS5lZGdlcyxvPXRoaXMuYm9keS5kYXRhLmVkZ2VzLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHM9dFtuXSxyPWlbc107ciYmci5kaXNjb25uZWN0KCk7dmFyIGE9by5nZXQocyx7c2hvd0ludGVybmFsSWRzOiEwfSk7aVtzXT10aGlzLmNyZWF0ZShhKX0hMT09PWUmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToidXBkYXRlIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5LmVkZ2VzLGk9dGhpcy5ib2R5LmRhdGEuZWRnZXMsbz0hMSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl0scj1pLmdldChzKSxhPWVbc107dm9pZCAwIT09YT8oYS5kaXNjb25uZWN0KCksbz1hLnNldE9wdGlvbnMocil8fG8sYS5jb25uZWN0KCkpOih0aGlzLmJvZHkuZWRnZXNbc109dGhpcy5jcmVhdGUociksbz0hMCl9ITA9PT1vP3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpOnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhVXBkYXRlZCIpfX0se2tleToicmVtb3ZlIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5LmVkZ2VzLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG89dFtpXSxuPWVbb107dm9pZCAwIT09biYmKG4uY2xlYW51cCgpLG4uZGlzY29ubmVjdCgpLGRlbGV0ZSBlW29dKX10aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfZGF0YUNoYW5nZWQiKX19LHtrZXk6InJlZnJlc2giLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ib2R5LmVkZ2VzO2Zvcih2YXIgZSBpbiB0KXt2YXIgaT12b2lkIDA7dC5oYXNPd25Qcm9wZXJ0eShlKSYmKGk9dFtlXSk7dmFyIG89dGhpcy5ib2R5LmRhdGEuZWRnZXMuX2RhdGFbZV07dm9pZCAwIT09aSYmdm9pZCAwIT09byYmaS5zZXRPcHRpb25zKG8pfX19LHtrZXk6ImNyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB1KHQsdGhpcy5ib2R5LHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zLHRoaXMuZWRnZU9wdGlvbnMpfX0se2tleToicmVjb25uZWN0RWRnZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmJvZHkubm9kZXMsaT10aGlzLmJvZHkuZWRnZXM7Zm9yKHQgaW4gZSllLmhhc093blByb3BlcnR5KHQpJiYoZVt0XS5lZGdlcz1bXSk7Zm9yKHQgaW4gaSlpZihpLmhhc093blByb3BlcnR5KHQpKXt2YXIgbz1pW3RdO28uZnJvbT1udWxsLG8udG89bnVsbCxvLmNvbm5lY3QoKX19fSx7a2V5OiJnZXRDb25uZWN0ZWROb2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9W107aWYodm9pZCAwIT09dGhpcy5ib2R5LmVkZ2VzW3RdKXt2YXIgaT10aGlzLmJvZHkuZWRnZXNbdF07dm9pZCAwIT09aS5mcm9tSWQmJmUucHVzaChpLmZyb21JZCksdm9pZCAwIT09aS50b0lkJiZlLnB1c2goaS50b0lkKX1yZXR1cm4gZX19XSksdH0oKTtlLmRlZmF1bHQ9cH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDkwKSxzPW8obikscj1pKDU1KSxhPW8ociksaD1pKDYyKSxkPW8oaCksbD1pKDEzNCksdT1vKGwpLGM9aSgxMzUpLHA9byhjKSxmPWkoMSksbT1pKDE2OSkuZGVmYXVsdCx2PWkoMjAyKS5kZWZhdWx0LGc9aSgyMDYpLmRlZmF1bHQseT1pKDIwNykuZGVmYXVsdCxiPWkoMjA4KS5kZWZhdWx0LF89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvLG4scyl7aWYoKDAsdS5kZWZhdWx0KSh0aGlzLHQpLHZvaWQgMD09PWkpdGhyb3ciTm8gYm9keSBwcm92aWRlZCI7dGhpcy5vcHRpb25zPWYuYnJpZGdlT2JqZWN0KG8pLHRoaXMuZ2xvYmFsT3B0aW9ucz1vLHRoaXMuZGVmYXVsdE9wdGlvbnM9bix0aGlzLmVkZ2VPcHRpb25zPXMsdGhpcy5ib2R5PWksdGhpcy5pZD12b2lkIDAsdGhpcy5mcm9tSWQ9dm9pZCAwLHRoaXMudG9JZD12b2lkIDAsdGhpcy5zZWxlY3RlZD0hMSx0aGlzLmhvdmVyPSExLHRoaXMubGFiZWxEaXJ0eT0hMCx0aGlzLmJhc2VXaWR0aD10aGlzLm9wdGlvbnMud2lkdGgsdGhpcy5iYXNlRm9udFNpemU9dGhpcy5vcHRpb25zLmZvbnQuc2l6ZSx0aGlzLmZyb209dm9pZCAwLHRoaXMudG89dm9pZCAwLHRoaXMuZWRnZVR5cGU9dm9pZCAwLHRoaXMuY29ubmVjdGVkPSExLHRoaXMubGFiZWxNb2R1bGU9bmV3IG0odGhpcy5ib2R5LHRoaXMub3B0aW9ucywhMCksdGhpcy5zZXRPcHRpb25zKGUpfXJldHVybigwLHAuZGVmYXVsdCkodCxbe2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoZSl7dC5wYXJzZU9wdGlvbnModGhpcy5vcHRpb25zLGUsITAsdGhpcy5nbG9iYWxPcHRpb25zKSx2b2lkIDAhPT1lLmlkJiYodGhpcy5pZD1lLmlkKSx2b2lkIDAhPT1lLmZyb20mJih0aGlzLmZyb21JZD1lLmZyb20pLHZvaWQgMCE9PWUudG8mJih0aGlzLnRvSWQ9ZS50byksdm9pZCAwIT09ZS50aXRsZSYmKHRoaXMudGl0bGU9ZS50aXRsZSksdm9pZCAwIT09ZS52YWx1ZSYmKGUudmFsdWU9cGFyc2VGbG9hdChlLnZhbHVlKSksdGhpcy5jaG9vc2lmeShlKSx0aGlzLnVwZGF0ZUxhYmVsTW9kdWxlKGUpLHRoaXMubGFiZWxNb2R1bGUucHJvcGFnYXRlRm9udHModGhpcy5lZGdlT3B0aW9ucyxlLHRoaXMuZGVmYXVsdE9wdGlvbnMpO3ZhciBpPXRoaXMudXBkYXRlRWRnZVR5cGUoKTtyZXR1cm4gdGhpcy5fc2V0SW50ZXJhY3Rpb25XaWR0aHMoKSx0aGlzLmNvbm5lY3QoKSx2b2lkIDA9PT1lLmhpZGRlbiYmdm9pZCAwPT09ZS5waHlzaWNzfHwoaT0hMCksaX19fSx7a2V5OiJjaG9vc2lmeSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5jaG9vc2VyPSEwO3ZhciBlPVt0LHRoaXMub3B0aW9ucyx0aGlzLmVkZ2VPcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnNdLGk9Zi50b3BNb3N0KGUsImNob3NlbiIpO2lmKCJib29sZWFuIj09dHlwZW9mIGkpdGhpcy5jaG9vc2VyPWk7ZWxzZSBpZigib2JqZWN0Ij09PSh2b2lkIDA9PT1pPyJ1bmRlZmluZWQiOigwLGQuZGVmYXVsdCkoaSkpKXt2YXIgbz1mLnRvcE1vc3QoZSxbImNob3NlbiIsImVkZ2UiXSk7ImJvb2xlYW4iIT10eXBlb2YgbyYmImZ1bmN0aW9uIiE9dHlwZW9mIG98fCh0aGlzLmNob29zZXI9byl9fX0se2tleToiZ2V0Rm9ybWF0dGluZ1ZhbHVlcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0hMD09PXRoaXMub3B0aW9ucy5hcnJvd3MudG98fCEwPT09dGhpcy5vcHRpb25zLmFycm93cy50by5lbmFibGVkLGU9ITA9PT10aGlzLm9wdGlvbnMuYXJyb3dzLmZyb218fCEwPT09dGhpcy5vcHRpb25zLmFycm93cy5mcm9tLmVuYWJsZWQsaT0hMD09PXRoaXMub3B0aW9ucy5hcnJvd3MubWlkZGxlfHwhMD09PXRoaXMub3B0aW9ucy5hcnJvd3MubWlkZGxlLmVuYWJsZWQsbz10aGlzLm9wdGlvbnMuY29sb3IuaW5oZXJpdCxuPXt0b0Fycm93OnQsdG9BcnJvd1NjYWxlOnRoaXMub3B0aW9ucy5hcnJvd3MudG8uc2NhbGVGYWN0b3IsdG9BcnJvd1R5cGU6dGhpcy5vcHRpb25zLmFycm93cy50by50eXBlLG1pZGRsZUFycm93OmksbWlkZGxlQXJyb3dTY2FsZTp0aGlzLm9wdGlvbnMuYXJyb3dzLm1pZGRsZS5zY2FsZUZhY3RvcixtaWRkbGVBcnJvd1R5cGU6dGhpcy5vcHRpb25zLmFycm93cy5taWRkbGUudHlwZSxmcm9tQXJyb3c6ZSxmcm9tQXJyb3dTY2FsZTp0aGlzLm9wdGlvbnMuYXJyb3dzLmZyb20uc2NhbGVGYWN0b3IsZnJvbUFycm93VHlwZTp0aGlzLm9wdGlvbnMuYXJyb3dzLmZyb20udHlwZSxhcnJvd1N0cmlrZXRocm91Z2g6dGhpcy5vcHRpb25zLmFycm93U3RyaWtldGhyb3VnaCxjb2xvcjpvP3ZvaWQgMDp0aGlzLm9wdGlvbnMuY29sb3IuY29sb3IsaW5oZXJpdHNDb2xvcjpvLG9wYWNpdHk6dGhpcy5vcHRpb25zLmNvbG9yLm9wYWNpdHksaGlkZGVuOnRoaXMub3B0aW9ucy5oaWRkZW4sbGVuZ3RoOnRoaXMub3B0aW9ucy5sZW5ndGgsc2hhZG93OnRoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZCxzaGFkb3dDb2xvcjp0aGlzLm9wdGlvbnMuc2hhZG93LmNvbG9yLHNoYWRvd1NpemU6dGhpcy5vcHRpb25zLnNoYWRvdy5zaXplLHNoYWRvd1g6dGhpcy5vcHRpb25zLnNoYWRvdy54LHNoYWRvd1k6dGhpcy5vcHRpb25zLnNoYWRvdy55LGRhc2hlczp0aGlzLm9wdGlvbnMuZGFzaGVzLHdpZHRoOnRoaXMub3B0aW9ucy53aWR0aH07aWYodGhpcy5zZWxlY3RlZHx8dGhpcy5ob3ZlcilpZighMD09PXRoaXMuY2hvb3Nlcil7aWYodGhpcy5zZWxlY3RlZCl7dmFyIHM9dGhpcy5vcHRpb25zLnNlbGVjdGlvbldpZHRoOyJmdW5jdGlvbiI9PXR5cGVvZiBzP24ud2lkdGg9cyhuLndpZHRoKToibnVtYmVyIj09dHlwZW9mIHMmJihuLndpZHRoKz1zKSxuLndpZHRoPU1hdGgubWF4KG4ud2lkdGgsLjMvdGhpcy5ib2R5LnZpZXcuc2NhbGUpLG4uY29sb3I9dGhpcy5vcHRpb25zLmNvbG9yLmhpZ2hsaWdodCxuLnNoYWRvdz10aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWR9ZWxzZSBpZih0aGlzLmhvdmVyKXt2YXIgcj10aGlzLm9wdGlvbnMuaG92ZXJXaWR0aDsiZnVuY3Rpb24iPT10eXBlb2Ygcj9uLndpZHRoPXIobi53aWR0aCk6Im51bWJlciI9PXR5cGVvZiByJiYobi53aWR0aCs9ciksbi53aWR0aD1NYXRoLm1heChuLndpZHRoLC4zL3RoaXMuYm9keS52aWV3LnNjYWxlKSxuLmNvbG9yPXRoaXMub3B0aW9ucy5jb2xvci5ob3ZlcixuLnNoYWRvdz10aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWR9fWVsc2UiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jaG9vc2VyJiYodGhpcy5jaG9vc2VyKG4sdGhpcy5vcHRpb25zLmlkLHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3Zlciksdm9pZCAwIT09bi5jb2xvciYmKG4uaW5oZXJpdHNDb2xvcj0hMSksITE9PT1uLnNoYWRvdyYmKG4uc2hhZG93Q29sb3I9PT10aGlzLm9wdGlvbnMuc2hhZG93LmNvbG9yJiZuLnNoYWRvd1NpemU9PT10aGlzLm9wdGlvbnMuc2hhZG93LnNpemUmJm4uc2hhZG93WD09PXRoaXMub3B0aW9ucy5zaGFkb3cueCYmbi5zaGFkb3dZPT09dGhpcy5vcHRpb25zLnNoYWRvdy55fHwobi5zaGFkb3c9ITApKSk7ZWxzZSBuLnNoYWRvdz10aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWQsbi53aWR0aD1NYXRoLm1heChuLndpZHRoLC4zL3RoaXMuYm9keS52aWV3LnNjYWxlKTtyZXR1cm4gbn19LHtrZXk6InVwZGF0ZUxhYmVsTW9kdWxlIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmxhYmVsTW9kdWxlLnNldE9wdGlvbnModGhpcy5vcHRpb25zLCEwKSx2b2lkIDAhPT10aGlzLmxhYmVsTW9kdWxlLmJhc2VTaXplJiYodGhpcy5iYXNlRm9udFNpemU9dGhpcy5sYWJlbE1vZHVsZS5iYXNlU2l6ZSksdGhpcy5sYWJlbE1vZHVsZS5jb25zdHJhaW4odGhpcy5lZGdlT3B0aW9ucyx0LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMubGFiZWxNb2R1bGUuY2hvb3NpZnkodGhpcy5lZGdlT3B0aW9ucyx0LHRoaXMuZGVmYXVsdE9wdGlvbnMpfX0se2tleToidXBkYXRlRWRnZVR5cGUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLnNtb290aCxlPSExLGk9ITA7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZWRnZVR5cGUmJigodGhpcy5lZGdlVHlwZSBpbnN0YW5jZW9mIGcmJiEwPT09dC5lbmFibGVkJiYiZHluYW1pYyI9PT10LnR5cGV8fHRoaXMuZWRnZVR5cGUgaW5zdGFuY2VvZiB2JiYhMD09PXQuZW5hYmxlZCYmImN1YmljQmV6aWVyIj09PXQudHlwZXx8dGhpcy5lZGdlVHlwZSBpbnN0YW5jZW9mIHkmJiEwPT09dC5lbmFibGVkJiYiZHluYW1pYyIhPT10LnR5cGUmJiJjdWJpY0JlemllciIhPT10LnR5cGV8fHRoaXMuZWRnZVR5cGUgaW5zdGFuY2VvZiBiJiYhMT09PXQudHlwZS5lbmFibGVkKSYmKGk9ITEpLCEwPT09aSYmKGU9dGhpcy5jbGVhbnVwKCkpKSwhMD09PWk/ITA9PT10LmVuYWJsZWQ/ImR5bmFtaWMiPT09dC50eXBlPyhlPSEwLHRoaXMuZWRnZVR5cGU9bmV3IGcodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKSk6ImN1YmljQmV6aWVyIj09PXQudHlwZT90aGlzLmVkZ2VUeXBlPW5ldyB2KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk6dGhpcy5lZGdlVHlwZT1uZXcgeSh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpOnRoaXMuZWRnZVR5cGU9bmV3IGIodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTp0aGlzLmVkZ2VUeXBlLnNldE9wdGlvbnModGhpcy5vcHRpb25zKSxlfX0se2tleToiY29ubmVjdCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZyb209dGhpcy5ib2R5Lm5vZGVzW3RoaXMuZnJvbUlkXXx8dm9pZCAwLHRoaXMudG89dGhpcy5ib2R5Lm5vZGVzW3RoaXMudG9JZF18fHZvaWQgMCx0aGlzLmNvbm5lY3RlZD12b2lkIDAhPT10aGlzLmZyb20mJnZvaWQgMCE9PXRoaXMudG8sITA9PT10aGlzLmNvbm5lY3RlZD8odGhpcy5mcm9tLmF0dGFjaEVkZ2UodGhpcyksdGhpcy50by5hdHRhY2hFZGdlKHRoaXMpKToodGhpcy5mcm9tJiZ0aGlzLmZyb20uZGV0YWNoRWRnZSh0aGlzKSx0aGlzLnRvJiZ0aGlzLnRvLmRldGFjaEVkZ2UodGhpcykpLHRoaXMuZWRnZVR5cGUuY29ubmVjdCgpfX0se2tleToiZGlzY29ubmVjdCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmZyb20mJih0aGlzLmZyb20uZGV0YWNoRWRnZSh0aGlzKSx0aGlzLmZyb209dm9pZCAwKSx0aGlzLnRvJiYodGhpcy50by5kZXRhY2hFZGdlKHRoaXMpLHRoaXMudG89dm9pZCAwKSx0aGlzLmNvbm5lY3RlZD0hMX19LHtrZXk6ImdldFRpdGxlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRpdGxlfX0se2tleToiaXNTZWxlY3RlZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3RlZH19LHtrZXk6ImdldFZhbHVlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudmFsdWV9fSx7a2V5OiJzZXRWYWx1ZVJhbmdlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7aWYodm9pZCAwIT09dGhpcy5vcHRpb25zLnZhbHVlKXt2YXIgbz10aGlzLm9wdGlvbnMuc2NhbGluZy5jdXN0b21TY2FsaW5nRnVuY3Rpb24odCxlLGksdGhpcy5vcHRpb25zLnZhbHVlKSxuPXRoaXMub3B0aW9ucy5zY2FsaW5nLm1heC10aGlzLm9wdGlvbnMuc2NhbGluZy5taW47aWYoITA9PT10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5lbmFibGVkKXt2YXIgcz10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5tYXgtdGhpcy5vcHRpb25zLnNjYWxpbmcubGFiZWwubWluO3RoaXMub3B0aW9ucy5mb250LnNpemU9dGhpcy5vcHRpb25zLnNjYWxpbmcubGFiZWwubWluK28qc310aGlzLm9wdGlvbnMud2lkdGg9dGhpcy5vcHRpb25zLnNjYWxpbmcubWluK28qbn1lbHNlIHRoaXMub3B0aW9ucy53aWR0aD10aGlzLmJhc2VXaWR0aCx0aGlzLm9wdGlvbnMuZm9udC5zaXplPXRoaXMuYmFzZUZvbnRTaXplO3RoaXMuX3NldEludGVyYWN0aW9uV2lkdGhzKCksdGhpcy51cGRhdGVMYWJlbE1vZHVsZSgpfX0se2tleToiX3NldEludGVyYWN0aW9uV2lkdGhzIix2YWx1ZTpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuaG92ZXJXaWR0aD90aGlzLmVkZ2VUeXBlLmhvdmVyV2lkdGg9dGhpcy5vcHRpb25zLmhvdmVyV2lkdGgodGhpcy5vcHRpb25zLndpZHRoKTp0aGlzLmVkZ2VUeXBlLmhvdmVyV2lkdGg9dGhpcy5vcHRpb25zLmhvdmVyV2lkdGgrdGhpcy5vcHRpb25zLndpZHRoLCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuc2VsZWN0aW9uV2lkdGg/dGhpcy5lZGdlVHlwZS5zZWxlY3Rpb25XaWR0aD10aGlzLm9wdGlvbnMuc2VsZWN0aW9uV2lkdGgodGhpcy5vcHRpb25zLndpZHRoKTp0aGlzLmVkZ2VUeXBlLnNlbGVjdGlvbldpZHRoPXRoaXMub3B0aW9ucy5zZWxlY3Rpb25XaWR0aCt0aGlzLm9wdGlvbnMud2lkdGh9fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEZvcm1hdHRpbmdWYWx1ZXMoKTtpZighZS5oaWRkZW4pe3ZhciBpPXRoaXMuZWRnZVR5cGUuZ2V0VmlhTm9kZSgpLG89e307dGhpcy5lZGdlVHlwZS5mcm9tUG9pbnQ9dGhpcy5lZGdlVHlwZS5mcm9tLHRoaXMuZWRnZVR5cGUudG9Qb2ludD10aGlzLmVkZ2VUeXBlLnRvLGUuZnJvbUFycm93JiYoby5mcm9tPXRoaXMuZWRnZVR5cGUuZ2V0QXJyb3dEYXRhKHQsImZyb20iLGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUpLCExPT09ZS5hcnJvd1N0cmlrZXRocm91Z2gmJih0aGlzLmVkZ2VUeXBlLmZyb21Qb2ludD1vLmZyb20uY29yZSkpLGUudG9BcnJvdyYmKG8udG89dGhpcy5lZGdlVHlwZS5nZXRBcnJvd0RhdGEodCwidG8iLGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUpLCExPT09ZS5hcnJvd1N0cmlrZXRocm91Z2gmJih0aGlzLmVkZ2VUeXBlLnRvUG9pbnQ9by50by5jb3JlKSksZS5taWRkbGVBcnJvdyYmKG8ubWlkZGxlPXRoaXMuZWRnZVR5cGUuZ2V0QXJyb3dEYXRhKHQsIm1pZGRsZSIsaSx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIsZSkpLHRoaXMuZWRnZVR5cGUuZHJhd0xpbmUodCxlLHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixpKSx0aGlzLmRyYXdBcnJvd3ModCxvLGUpLHRoaXMuZHJhd0xhYmVsKHQsaSl9fX0se2tleToiZHJhd0Fycm93cyIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2kuZnJvbUFycm93JiZ0aGlzLmVkZ2VUeXBlLmRyYXdBcnJvd0hlYWQodCxpLHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixlLmZyb20pLGkubWlkZGxlQXJyb3cmJnRoaXMuZWRnZVR5cGUuZHJhd0Fycm93SGVhZCh0LGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUubWlkZGxlKSxpLnRvQXJyb3cmJnRoaXMuZWRnZVR5cGUuZHJhd0Fycm93SGVhZCh0LGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUudG8pfX0se2tleToiZHJhd0xhYmVsIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PXRoaXMub3B0aW9ucy5sYWJlbCl7dmFyIGk9dGhpcy5mcm9tLG89dGhpcy50byxuPXRoaXMuZnJvbS5zZWxlY3RlZHx8dGhpcy50by5zZWxlY3RlZHx8dGhpcy5zZWxlY3RlZDtpZihpLmlkIT1vLmlkKXt0aGlzLmxhYmVsTW9kdWxlLnBvaW50VG9TZWxmPSExO3ZhciBzPXRoaXMuZWRnZVR5cGUuZ2V0UG9pbnQoLjUsZSk7dC5zYXZlKCksImhvcml6b250YWwiIT09dGhpcy5vcHRpb25zLmZvbnQuYWxpZ24mJih0aGlzLmxhYmVsTW9kdWxlLmNhbGN1bGF0ZUxhYmVsU2l6ZSh0LG4sdGhpcy5ob3ZlcixzLngscy55KSx0LnRyYW5zbGF0ZShzLngsdGhpcy5sYWJlbE1vZHVsZS5zaXplLnlMaW5lKSx0aGlzLl9yb3RhdGVGb3JMYWJlbEFsaWdubWVudCh0KSksdGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQscy54LHMueSxuLHRoaXMuaG92ZXIpLHQucmVzdG9yZSgpfWVsc2V7dGhpcy5sYWJlbE1vZHVsZS5wb2ludFRvU2VsZj0hMDt2YXIgcixhLGg9dGhpcy5vcHRpb25zLnNlbGZSZWZlcmVuY2VTaXplO2kuc2hhcGUud2lkdGg+aS5zaGFwZS5oZWlnaHQ/KHI9aS54Ky41Kmkuc2hhcGUud2lkdGgsYT1pLnktaCk6KHI9aS54K2gsYT1pLnktLjUqaS5zaGFwZS5oZWlnaHQpLHM9dGhpcy5fcG9pbnRPbkNpcmNsZShyLGEsaCwuMTI1KSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCxzLngscy55LG4sdGhpcy5ob3Zlcil9fX19LHtrZXk6ImlzT3ZlcmxhcHBpbmdXaXRoIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLmNvbm5lY3RlZCl7dmFyIGU9dGhpcy5mcm9tLngsaT10aGlzLmZyb20ueSxvPXRoaXMudG8ueCxuPXRoaXMudG8ueSxzPXQubGVmdCxyPXQudG9wO3JldHVybiB0aGlzLmVkZ2VUeXBlLmdldERpc3RhbmNlVG9FZGdlKGUsaSxvLG4scyxyKTwxMH1yZXR1cm4hMX19LHtrZXk6Il9yb3RhdGVGb3JMYWJlbEFsaWdubWVudCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mcm9tLnktdGhpcy50by55LGk9dGhpcy5mcm9tLngtdGhpcy50by54LG89TWF0aC5hdGFuMihlLGkpOyhvPC0xJiZpPDB8fG8+MCYmaTwwKSYmKG8rPU1hdGguUEkpLHQucm90YXRlKG8pfX0se2tleToiX3BvaW50T25DaXJjbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPTIqbypNYXRoLlBJO3JldHVybnt4OnQraSpNYXRoLmNvcyhuKSx5OmUtaSpNYXRoLnNpbihuKX19fSx7a2V5OiJzZWxlY3QiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD0hMH19LHtrZXk6InVuc2VsZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9ITF9fSx7a2V5OiJjbGVhbnVwIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VUeXBlLmNsZWFudXAoKX19XSxbe2tleToicGFyc2VPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0sbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e30sbj1bImFycm93U3RyaWtldGhyb3VnaCIsImlkIiwiZnJvbSIsImhpZGRlbiIsImhvdmVyV2lkdGgiLCJsYWJlbCIsImxhYmVsSGlnaGxpZ2h0Qm9sZCIsImxlbmd0aCIsImxpbmUiLCJvcGFjaXR5IiwicGh5c2ljcyIsInNjYWxpbmciLCJzZWxlY3Rpb25XaWR0aCIsInNlbGZSZWZlcmVuY2VTaXplIiwidG8iLCJ0aXRsZSIsInZhbHVlIiwid2lkdGgiXTtpZihmLnNlbGVjdGl2ZURlZXBFeHRlbmQobix0LGUsaSksZi5tZXJnZU9wdGlvbnModCxlLCJzbW9vdGgiLGksbyksZi5tZXJnZU9wdGlvbnModCxlLCJzaGFkb3ciLGksbyksdm9pZCAwIT09ZS5kYXNoZXMmJm51bGwhPT1lLmRhc2hlcz90LmRhc2hlcz1lLmRhc2hlczohMD09PWkmJm51bGw9PT1lLmRhc2hlcyYmKHQuZGFzaGVzPSgwLGEuZGVmYXVsdCkoby5kYXNoZXMpKSx2b2lkIDAhPT1lLnNjYWxpbmcmJm51bGwhPT1lLnNjYWxpbmc/KHZvaWQgMCE9PWUuc2NhbGluZy5taW4mJih0LnNjYWxpbmcubWluPWUuc2NhbGluZy5taW4pLHZvaWQgMCE9PWUuc2NhbGluZy5tYXgmJih0LnNjYWxpbmcubWF4PWUuc2NhbGluZy5tYXgpLGYubWVyZ2VPcHRpb25zKHQuc2NhbGluZyxlLnNjYWxpbmcsImxhYmVsIixpLG8uc2NhbGluZykpOiEwPT09aSYmbnVsbD09PWUuc2NhbGluZyYmKHQuc2NhbGluZz0oMCxhLmRlZmF1bHQpKG8uc2NhbGluZykpLHZvaWQgMCE9PWUuYXJyb3dzJiZudWxsIT09ZS5hcnJvd3MpaWYoInN0cmluZyI9PXR5cGVvZiBlLmFycm93cyl7dmFyIHI9ZS5hcnJvd3MudG9Mb3dlckNhc2UoKTt0LmFycm93cy50by5lbmFibGVkPS0xIT1yLmluZGV4T2YoInRvIiksdC5hcnJvd3MubWlkZGxlLmVuYWJsZWQ9LTEhPXIuaW5kZXhPZigibWlkZGxlIiksdC5hcnJvd3MuZnJvbS5lbmFibGVkPS0xIT1yLmluZGV4T2YoImZyb20iKX1lbHNle2lmKCJvYmplY3QiIT09KDAsZC5kZWZhdWx0KShlLmFycm93cykpdGhyb3cgbmV3IEVycm9yKCJUaGUgYXJyb3cgbmV3T3B0aW9ucyBjYW4gb25seSBiZSBhbiBvYmplY3Qgb3IgYSBzdHJpbmcuIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uLiBZb3UgdXNlZDoiKygwLHMuZGVmYXVsdCkoZS5hcnJvd3MpKTtmLm1lcmdlT3B0aW9ucyh0LmFycm93cyxlLmFycm93cywidG8iLGksby5hcnJvd3MpLGYubWVyZ2VPcHRpb25zKHQuYXJyb3dzLGUuYXJyb3dzLCJtaWRkbGUiLGksby5hcnJvd3MpLGYubWVyZ2VPcHRpb25zKHQuYXJyb3dzLGUuYXJyb3dzLCJmcm9tIixpLG8uYXJyb3dzKX1lbHNlITA9PT1pJiZudWxsPT09ZS5hcnJvd3MmJih0LmFycm93cz0oMCxhLmRlZmF1bHQpKG8uYXJyb3dzKSk7aWYodm9pZCAwIT09ZS5jb2xvciYmbnVsbCE9PWUuY29sb3IpaWYodC5jb2xvcj1mLmRlZXBFeHRlbmQoe30sdC5jb2xvciwhMCksZi5pc1N0cmluZyhlLmNvbG9yKSl0LmNvbG9yLmNvbG9yPWUuY29sb3IsdC5jb2xvci5oaWdobGlnaHQ9ZS5jb2xvcix0LmNvbG9yLmhvdmVyPWUuY29sb3IsdC5jb2xvci5pbmhlcml0PSExO2Vsc2V7dmFyIGg9ITE7dm9pZCAwIT09ZS5jb2xvci5jb2xvciYmKHQuY29sb3IuY29sb3I9ZS5jb2xvci5jb2xvcixoPSEwKSx2b2lkIDAhPT1lLmNvbG9yLmhpZ2hsaWdodCYmKHQuY29sb3IuaGlnaGxpZ2h0PWUuY29sb3IuaGlnaGxpZ2h0LGg9ITApLHZvaWQgMCE9PWUuY29sb3IuaG92ZXImJih0LmNvbG9yLmhvdmVyPWUuY29sb3IuaG92ZXIsaD0hMCksdm9pZCAwIT09ZS5jb2xvci5pbmhlcml0JiYodC5jb2xvci5pbmhlcml0PWUuY29sb3IuaW5oZXJpdCksdm9pZCAwIT09ZS5jb2xvci5vcGFjaXR5JiYodC5jb2xvci5vcGFjaXR5PU1hdGgubWluKDEsTWF0aC5tYXgoMCxlLmNvbG9yLm9wYWNpdHkpKSksdm9pZCAwPT09ZS5jb2xvci5pbmhlcml0JiYhMD09PWgmJih0LmNvbG9yLmluaGVyaXQ9ITEpfWVsc2UhMD09PWkmJm51bGw9PT1lLmNvbG9yJiYodC5jb2xvcj1mLmJyaWRnZU9iamVjdChvLmNvbG9yKSk7dm9pZCAwIT09ZS5mb250JiZudWxsIT09ZS5mb250P20ucGFyc2VPcHRpb25zKHQuZm9udCxlKTohMD09PWkmJm51bGw9PT1lLmZvbnQmJih0LmZvbnQ9Zi5icmlkZ2VPYmplY3Qoby5mb250KSl9fV0pLHR9KCk7ZS5kZWZhdWx0PV99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzApLHM9byhuKSxyPWkoMTc1KSxhPW8ociksaD1pKDEzNCksZD1vKGgpLGw9aSgxMzUpLHU9byhsKSxjPWkoMTc4KSxwPW8oYyksZj1pKDE3OSksbT1vKGYpLHY9aSgyMDMpLGc9byh2KSx5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybigwLGQuZGVmYXVsdCkodGhpcyxlKSwoMCxwLmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxhLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4oMCxtLmRlZmF1bHQpKGUsdCksKDAsdS5kZWZhdWx0KShlLFt7a2V5OiJfbGluZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWlbMF0sbj1pWzFdO3QuYmVnaW5QYXRoKCksdC5tb3ZlVG8odGhpcy5mcm9tUG9pbnQueCx0aGlzLmZyb21Qb2ludC55KSx2b2lkIDA9PT1pfHx2b2lkIDA9PT1vLng/dC5saW5lVG8odGhpcy50b1BvaW50LngsdGhpcy50b1BvaW50LnkpOnQuYmV6aWVyQ3VydmVUbyhvLngsby55LG4ueCxuLnksdGhpcy50b1BvaW50LngsdGhpcy50b1BvaW50LnkpLHRoaXMuZW5hYmxlU2hhZG93KHQsZSksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVTaGFkb3codCxlKX19LHtrZXk6Il9nZXRWaWFDb29yZGluYXRlcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmZyb20ueC10aGlzLnRvLngsZT10aGlzLmZyb20ueS10aGlzLnRvLnksaT12b2lkIDAsbz12b2lkIDAsbj12b2lkIDAscz12b2lkIDAscj10aGlzLm9wdGlvbnMuc21vb3RoLnJvdW5kbmVzcztyZXR1cm4oTWF0aC5hYnModCk+TWF0aC5hYnMoZSl8fCEwPT09dGhpcy5vcHRpb25zLnNtb290aC5mb3JjZURpcmVjdGlvbnx8Imhvcml6b250YWwiPT09dGhpcy5vcHRpb25zLnNtb290aC5mb3JjZURpcmVjdGlvbikmJiJ2ZXJ0aWNhbCIhPT10aGlzLm9wdGlvbnMuc21vb3RoLmZvcmNlRGlyZWN0aW9uPyhvPXRoaXMuZnJvbS55LHM9dGhpcy50by55LGk9dGhpcy5mcm9tLngtcip0LG49dGhpcy50by54K3IqdCk6KG89dGhpcy5mcm9tLnktciplLHM9dGhpcy50by55K3IqZSxpPXRoaXMuZnJvbS54LG49dGhpcy50by54KSxbe3g6aSx5Om99LHt4Om4seTpzfV19fSx7a2V5OiJnZXRWaWFOb2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRWaWFDb29yZGluYXRlcygpfX0se2tleToiX2ZpbmRCb3JkZXJQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZmluZEJvcmRlclBvc2l0aW9uQmV6aWVyKHQsZSl9fSx7a2V5OiJfZ2V0RGlzdGFuY2VUb0VkZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixyKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjYmJnZvaWQgMCE9PWFyZ3VtZW50c1s2XT9hcmd1bWVudHNbNl06dGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKSxoPSgwLHMuZGVmYXVsdCkoYSwyKSxkPWhbMF0sbD1oWzFdO3JldHVybiB0aGlzLl9nZXREaXN0YW5jZVRvQmV6aWVyRWRnZSh0LGUsaSxvLG4scixkLGwpfX0se2tleToiZ2V0UG9pbnQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLl9nZXRWaWFDb29yZGluYXRlcygpLGk9KDAscy5kZWZhdWx0KShlLDIpLG89aVswXSxuPWlbMV0scj10LGE9W107cmV0dXJuIGFbMF09TWF0aC5wb3coMS1yLDMpLGFbMV09MypyKk1hdGgucG93KDEtciwyKSxhWzJdPTMqTWF0aC5wb3cociwyKSooMS1yKSxhWzNdPU1hdGgucG93KHIsMykse3g6YVswXSp0aGlzLmZyb21Qb2ludC54K2FbMV0qby54K2FbMl0qbi54K2FbM10qdGhpcy50b1BvaW50LngseTphWzBdKnRoaXMuZnJvbVBvaW50LnkrYVsxXSpvLnkrYVsyXSpuLnkrYVszXSp0aGlzLnRvUG9pbnQueX19fV0pLGV9KGcuZGVmYXVsdCk7ZS5kZWZhdWx0PXl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzUpLHM9byhuKSxyPWkoMTM0KSxhPW8ociksaD1pKDEzNSksZD1vKGgpLGw9aSgxNzgpLHU9byhsKSxjPWkoMTc5KSxwPW8oYyksZj1pKDIwNCksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6Il9nZXREaXN0YW5jZVRvQmV6aWVyRWRnZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMscixhKXt2YXIgaD0xZTksZD12b2lkIDAsbD12b2lkIDAsdT12b2lkIDAsYz12b2lkIDAscD12b2lkIDAsZj10LG09ZSx2PVswLDAsMCwwXTtmb3IobD0xO2w8MTA7bCsrKXU9LjEqbCx2WzBdPU1hdGgucG93KDEtdSwzKSx2WzFdPTMqdSpNYXRoLnBvdygxLXUsMiksdlsyXT0zKk1hdGgucG93KHUsMikqKDEtdSksdlszXT1NYXRoLnBvdyh1LDMpLGM9dlswXSp0K3ZbMV0qci54K3ZbMl0qYS54K3ZbM10qaSxwPXZbMF0qZSt2WzFdKnIueSt2WzJdKmEueSt2WzNdKm8sbD4wJiYoZD10aGlzLl9nZXREaXN0YW5jZVRvTGluZShmLG0sYyxwLG4scyksaD1kPGg/ZDpoKSxmPWMsbT1wO3JldHVybiBofX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTc1KSxzPW8obikscj1pKDEzNCksYT1vKHIpLGg9aSgxMzUpLGQ9byhoKSxsPWkoMTc4KSx1PW8obCksYz1pKDE3OSkscD1vKGMpLGY9aSgyMDUpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybigwLGEuZGVmYXVsdCkodGhpcyxlKSwoMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OiJfZmluZEJvcmRlclBvc2l0aW9uQmV6aWVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpLG8sbixzLHIsYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKSxoPTAsZD0wLGw9MSx1PXRoaXMudG8sYz0hMTtmb3IodC5pZD09PXRoaXMuZnJvbS5pZCYmKHU9dGhpcy5mcm9tLGM9ITApO2Q8PWwmJmg8MTA7KXt2YXIgcD0uNSooZCtsKTtpZihpPXRoaXMuZ2V0UG9pbnQocCxhKSxvPU1hdGguYXRhbjIodS55LWkueSx1LngtaS54KSxuPXUuZGlzdGFuY2VUb0JvcmRlcihlLG8pLHM9TWF0aC5zcXJ0KE1hdGgucG93KGkueC11LngsMikrTWF0aC5wb3coaS55LXUueSwyKSkscj1uLXMsTWF0aC5hYnMocik8LjIpYnJlYWs7cjwwPyExPT09Yz9kPXA6bD1wOiExPT09Yz9sPXA6ZD1wLGgrK31yZXR1cm4gaS50PXAsaX19LHtrZXk6Il9nZXREaXN0YW5jZVRvQmV6aWVyRWRnZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMscil7dmFyIGE9MWU5LGg9dm9pZCAwLGQ9dm9pZCAwLGw9dm9pZCAwLHU9dm9pZCAwLGM9dm9pZCAwLHA9dCxmPWU7Zm9yKGQ9MTtkPDEwO2QrKylsPS4xKmQsdT1NYXRoLnBvdygxLWwsMikqdCsyKmwqKDEtbCkqci54K01hdGgucG93KGwsMikqaSxjPU1hdGgucG93KDEtbCwyKSplKzIqbCooMS1sKSpyLnkrTWF0aC5wb3cobCwyKSpvLGQ+MCYmKGg9dGhpcy5fZ2V0RGlzdGFuY2VUb0xpbmUocCxmLHUsYyxuLHMpLGE9aDxhP2g6YSkscD11LGY9YztyZXR1cm4gYX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDE3MCkscz1vKG4pLHI9aSgxMzQpLGE9byhyKSxoPWkoMTM1KSxkPW8oaCksbD1pKDEpLHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvKXsoMCxhLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWksdGhpcy5sYWJlbE1vZHVsZT1vLHRoaXMub3B0aW9ucz17fSx0aGlzLnNldE9wdGlvbnMoZSksdGhpcy5jb2xvckRpcnR5PSEwLHRoaXMuY29sb3I9e30sdGhpcy5zZWxlY3Rpb25XaWR0aD0yLHRoaXMuaG92ZXJXaWR0aD0xLjUsdGhpcy5mcm9tUG9pbnQ9dGhpcy5mcm9tLHRoaXMudG9Qb2ludD10aGlzLnRvfXJldHVybigwLGQuZGVmYXVsdCkodCxbe2tleToiY29ubmVjdCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmZyb209dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy5mcm9tXSx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMudG9dfX0se2tleToiY2xlYW51cCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX19LHtrZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10LHRoaXMuZnJvbT10aGlzLmJvZHkubm9kZXNbdGhpcy5vcHRpb25zLmZyb21dLHRoaXMudG89dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy50b10sdGhpcy5pZD10aGlzLm9wdGlvbnMuaWR9fSx7a2V5OiJkcmF3TGluZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt0LnN0cm9rZVN0eWxlPXRoaXMuZ2V0Q29sb3IodCxlLGksbyksdC5saW5lV2lkdGg9ZS53aWR0aCwhMSE9PWUuZGFzaGVzP3RoaXMuX2RyYXdEYXNoZWRMaW5lKHQsZSxuKTp0aGlzLl9kcmF3TGluZSh0LGUsbil9fSx7a2V5OiJfZHJhd0xpbmUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7aWYodGhpcy5mcm9tIT10aGlzLnRvKXRoaXMuX2xpbmUodCxlLGksbyxuKTtlbHNle3ZhciByPXRoaXMuX2dldENpcmNsZURhdGEodCksYT0oMCxzLmRlZmF1bHQpKHIsMyksaD1hWzBdLGQ9YVsxXSxsPWFbMl07dGhpcy5fY2lyY2xlKHQsZSxoLGQsbCl9fX0se2tleToiX2RyYXdEYXNoZWRMaW5lIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3QubGluZUNhcD0icm91bmQiO3ZhciByPVs1LDVdO2lmKCEwPT09QXJyYXkuaXNBcnJheShlLmRhc2hlcykmJihyPWUuZGFzaGVzKSx2b2lkIDAhPT10LnNldExpbmVEYXNoKXtpZih0LnNhdmUoKSx0LnNldExpbmVEYXNoKHIpLHQubGluZURhc2hPZmZzZXQ9MCx0aGlzLmZyb20hPXRoaXMudG8pdGhpcy5fbGluZSh0LGUsaSk7ZWxzZXt2YXIgYT10aGlzLl9nZXRDaXJjbGVEYXRhKHQpLGg9KDAscy5kZWZhdWx0KShhLDMpLGQ9aFswXSxsPWhbMV0sdT1oWzJdO3RoaXMuX2NpcmNsZSh0LGUsZCxsLHUpfXQuc2V0TGluZURhc2goWzBdKSx0LmxpbmVEYXNoT2Zmc2V0PTAsdC5yZXN0b3JlKCl9ZWxzZXtpZih0aGlzLmZyb20hPXRoaXMudG8pdC5kYXNoZWRMaW5lKHRoaXMuZnJvbS54LHRoaXMuZnJvbS55LHRoaXMudG8ueCx0aGlzLnRvLnkscik7ZWxzZXt2YXIgYz10aGlzLl9nZXRDaXJjbGVEYXRhKHQpLHA9KDAscy5kZWZhdWx0KShjLDMpLGY9cFswXSxtPXBbMV0sdj1wWzJdO3RoaXMuX2NpcmNsZSh0LGUsZixtLHYpfXRoaXMuZW5hYmxlU2hhZG93KHQsZSksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVTaGFkb3codCxlKX19fSx7a2V5OiJmaW5kQm9yZGVyUG9zaXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5mcm9tIT10aGlzLnRvP3RoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbih0LGUsaSk6dGhpcy5fZmluZEJvcmRlclBvc2l0aW9uQ2lyY2xlKHQsZSxpKX19LHtrZXk6ImZpbmRCb3JkZXJQb3NpdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXt9LGk9e307aWYodGhpcy5mcm9tIT10aGlzLnRvKWU9dGhpcy5fZmluZEJvcmRlclBvc2l0aW9uKHRoaXMuZnJvbSx0KSxpPXRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbih0aGlzLnRvLHQpO2Vsc2V7dmFyIG89dGhpcy5fZ2V0Q2lyY2xlRGF0YSh0KSxuPSgwLHMuZGVmYXVsdCkobywzKSxyPW5bMF0sYT1uWzFdO25bMl07ZT10aGlzLl9maW5kQm9yZGVyUG9zaXRpb25DaXJjbGUodGhpcy5mcm9tLHQse3g6cix5OmEsbG93Oi4yNSxoaWdoOi42LGRpcmVjdGlvbjotMX0pLGk9dGhpcy5fZmluZEJvcmRlclBvc2l0aW9uQ2lyY2xlKHRoaXMuZnJvbSx0LHt4OnIseTphLGxvdzouNixoaWdoOi44LGRpcmVjdGlvbjoxfSl9cmV0dXJue2Zyb206ZSx0bzppfX19LHtrZXk6Il9nZXRDaXJjbGVEYXRhIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDAsaT12b2lkIDAsbz10aGlzLmZyb20sbj10aGlzLm9wdGlvbnMuc2VsZlJlZmVyZW5jZVNpemU7cmV0dXJuIHZvaWQgMCE9PXQmJnZvaWQgMD09PW8uc2hhcGUud2lkdGgmJm8uc2hhcGUucmVzaXplKHQpLApvLnNoYXBlLndpZHRoPm8uc2hhcGUuaGVpZ2h0PyhlPW8ueCsuNSpvLnNoYXBlLndpZHRoLGk9by55LW4pOihlPW8ueCtuLGk9by55LS41Km8uc2hhcGUuaGVpZ2h0KSxbZSxpLG5dfX0se2tleToiX3BvaW50T25DaXJjbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPTIqbypNYXRoLlBJO3JldHVybnt4OnQraSpNYXRoLmNvcyhuKSx5OmUtaSpNYXRoLnNpbihuKX19fSx7a2V5OiJfZmluZEJvcmRlclBvc2l0aW9uQ2lyY2xlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBvPWkueCxuPWkueSxzPWkubG93LHI9aS5oaWdoLGE9aS5kaXJlY3Rpb24saD0wLGQ9dGhpcy5vcHRpb25zLnNlbGZSZWZlcmVuY2VTaXplLGw9dm9pZCAwLHU9dm9pZCAwLGM9dm9pZCAwLHA9dm9pZCAwLGY9dm9pZCAwLG09LjUqKHMrcik7czw9ciYmaDwxMCYmKG09LjUqKHMrciksbD10aGlzLl9wb2ludE9uQ2lyY2xlKG8sbixkLG0pLHU9TWF0aC5hdGFuMih0LnktbC55LHQueC1sLngpLGM9dC5kaXN0YW5jZVRvQm9yZGVyKGUsdSkscD1NYXRoLnNxcnQoTWF0aC5wb3cobC54LXQueCwyKStNYXRoLnBvdyhsLnktdC55LDIpKSxmPWMtcCwhKE1hdGguYWJzKGYpPC4wNSkpOylmPjA/YT4wP3M9bTpyPW06YT4wP3I9bTpzPW0saCsrO3JldHVybiBsLnQ9bSxsfX0se2tleToiZ2V0TGluZVdpZHRoIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiEwPT09dD9NYXRoLm1heCh0aGlzLnNlbGVjdGlvbldpZHRoLC4zL3RoaXMuYm9keS52aWV3LnNjYWxlKTohMD09PWU/TWF0aC5tYXgodGhpcy5ob3ZlcldpZHRoLC4zL3RoaXMuYm9keS52aWV3LnNjYWxlKTpNYXRoLm1heCh0aGlzLm9wdGlvbnMud2lkdGgsLjMvdGhpcy5ib2R5LnZpZXcuc2NhbGUpfX0se2tleToiZ2V0Q29sb3IiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe2lmKCExIT09ZS5pbmhlcml0c0NvbG9yKXtpZigiYm90aCI9PT1lLmluaGVyaXRzQ29sb3ImJnRoaXMuZnJvbS5pZCE9PXRoaXMudG8uaWQpe3ZhciBuPXQuY3JlYXRlTGluZWFyR3JhZGllbnQodGhpcy5mcm9tLngsdGhpcy5mcm9tLnksdGhpcy50by54LHRoaXMudG8ueSkscz12b2lkIDAscj12b2lkIDA7cmV0dXJuIHM9dGhpcy5mcm9tLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJvcmRlcixyPXRoaXMudG8ub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYm9yZGVyLCExPT09dGhpcy5mcm9tLnNlbGVjdGVkJiYhMT09PXRoaXMudG8uc2VsZWN0ZWQ/KHM9bC5vdmVycmlkZU9wYWNpdHkodGhpcy5mcm9tLm9wdGlvbnMuY29sb3IuYm9yZGVyLGUub3BhY2l0eSkscj1sLm92ZXJyaWRlT3BhY2l0eSh0aGlzLnRvLm9wdGlvbnMuY29sb3IuYm9yZGVyLGUub3BhY2l0eSkpOiEwPT09dGhpcy5mcm9tLnNlbGVjdGVkJiYhMT09PXRoaXMudG8uc2VsZWN0ZWQ/cj10aGlzLnRvLm9wdGlvbnMuY29sb3IuYm9yZGVyOiExPT09dGhpcy5mcm9tLnNlbGVjdGVkJiYhMD09PXRoaXMudG8uc2VsZWN0ZWQmJihzPXRoaXMuZnJvbS5vcHRpb25zLmNvbG9yLmJvcmRlciksbi5hZGRDb2xvclN0b3AoMCxzKSxuLmFkZENvbG9yU3RvcCgxLHIpLG59cmV0dXJuInRvIj09PWUuaW5oZXJpdHNDb2xvcj9sLm92ZXJyaWRlT3BhY2l0eSh0aGlzLnRvLm9wdGlvbnMuY29sb3IuYm9yZGVyLGUub3BhY2l0eSk6bC5vdmVycmlkZU9wYWNpdHkodGhpcy5mcm9tLm9wdGlvbnMuY29sb3IuYm9yZGVyLGUub3BhY2l0eSl9cmV0dXJuIGwub3ZlcnJpZGVPcGFjaXR5KGUuY29sb3IsZS5vcGFjaXR5KX19LHtrZXk6Il9jaXJjbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7dGhpcy5lbmFibGVTaGFkb3codCxlKSx0LmJlZ2luUGF0aCgpLHQuYXJjKGksbyxuLDAsMipNYXRoLlBJLCExKSx0LnN0cm9rZSgpLHRoaXMuZGlzYWJsZVNoYWRvdyh0LGUpfX0se2tleToiZ2V0RGlzdGFuY2VUb0VkZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixyLGEsaCl7dmFyIGQ9MDtpZih0aGlzLmZyb20hPXRoaXMudG8pZD10aGlzLl9nZXREaXN0YW5jZVRvRWRnZSh0LGUsaSxvLG4scixhKTtlbHNle3ZhciBsPXRoaXMuX2dldENpcmNsZURhdGEodm9pZCAwKSx1PSgwLHMuZGVmYXVsdCkobCwzKSxjPXVbMF0scD11WzFdLGY9dVsyXSxtPWMtbix2PXAtcjtkPU1hdGguYWJzKE1hdGguc3FydChtKm0rdip2KS1mKX1yZXR1cm4gdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQ8biYmdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQrdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoPm4mJnRoaXMubGFiZWxNb2R1bGUuc2l6ZS50b3A8ciYmdGhpcy5sYWJlbE1vZHVsZS5zaXplLnRvcCt0aGlzLmxhYmVsTW9kdWxlLnNpemUuaGVpZ2h0PnI/MDpkfX0se2tleToiX2dldERpc3RhbmNlVG9MaW5lIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dmFyIHI9aS10LGE9by1lLGg9cipyK2EqYSxkPSgobi10KSpyKyhzLWUpKmEpL2g7ZD4xP2Q9MTpkPDAmJihkPTApO3ZhciBsPXQrZCpyLHU9ZStkKmEsYz1sLW4scD11LXM7cmV0dXJuIE1hdGguc3FydChjKmMrcCpwKX19LHtrZXk6ImdldEFycm93RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHIpe3ZhciBhPXZvaWQgMCxoPXZvaWQgMCxkPXZvaWQgMCxsPXZvaWQgMCx1PXZvaWQgMCxjPXZvaWQgMCxwPXZvaWQgMCxmPXIud2lkdGg7aWYoImZyb20iPT09ZT8oZD10aGlzLmZyb20sbD10aGlzLnRvLHU9LjEsYz1yLmZyb21BcnJvd1NjYWxlLHA9ci5mcm9tQXJyb3dUeXBlKToidG8iPT09ZT8oZD10aGlzLnRvLGw9dGhpcy5mcm9tLHU9LS4xLGM9ci50b0Fycm93U2NhbGUscD1yLnRvQXJyb3dUeXBlKTooZD10aGlzLnRvLGw9dGhpcy5mcm9tLGM9ci5taWRkbGVBcnJvd1NjYWxlLHA9ci5taWRkbGVBcnJvd1R5cGUpLGQhPWwpaWYoIm1pZGRsZSIhPT1lKWlmKCEwPT09dGhpcy5vcHRpb25zLnNtb290aC5lbmFibGVkKXtoPXRoaXMuZmluZEJvcmRlclBvc2l0aW9uKGQsdCx7dmlhOml9KTt2YXIgbT10aGlzLmdldFBvaW50KE1hdGgubWF4KDAsTWF0aC5taW4oMSxoLnQrdSkpLGkpO2E9TWF0aC5hdGFuMihoLnktbS55LGgueC1tLngpfWVsc2UgYT1NYXRoLmF0YW4yKGQueS1sLnksZC54LWwueCksaD10aGlzLmZpbmRCb3JkZXJQb3NpdGlvbihkLHQpO2Vsc2UgYT1NYXRoLmF0YW4yKGQueS1sLnksZC54LWwueCksaD10aGlzLmdldFBvaW50KC41LGkpO2Vsc2V7dmFyIHY9dGhpcy5fZ2V0Q2lyY2xlRGF0YSh0KSxnPSgwLHMuZGVmYXVsdCkodiwzKSx5PWdbMF0sYj1nWzFdLF89Z1syXTsiZnJvbSI9PT1lPyhoPXRoaXMuZmluZEJvcmRlclBvc2l0aW9uKHRoaXMuZnJvbSx0LHt4OnkseTpiLGxvdzouMjUsaGlnaDouNixkaXJlY3Rpb246LTF9KSxhPS0yKmgudCpNYXRoLlBJKzEuNSpNYXRoLlBJKy4xKk1hdGguUEkpOiJ0byI9PT1lPyhoPXRoaXMuZmluZEJvcmRlclBvc2l0aW9uKHRoaXMuZnJvbSx0LHt4OnkseTpiLGxvdzouNixoaWdoOjEsZGlyZWN0aW9uOjF9KSxhPS0yKmgudCpNYXRoLlBJKzEuNSpNYXRoLlBJLTEuMSpNYXRoLlBJKTooaD10aGlzLl9wb2ludE9uQ2lyY2xlKHksYixfLC4xNzUpLGE9My45MjY5OTA4MTY5ODcyNDE0KX12YXIgdz0xNSpjKzMqZjtyZXR1cm57cG9pbnQ6aCxjb3JlOnt4OmgueC0uOSp3Kk1hdGguY29zKGEpLHk6aC55LS45KncqTWF0aC5zaW4oYSl9LGFuZ2xlOmEsbGVuZ3RoOncsdHlwZTpwfX19LHtrZXk6ImRyYXdBcnJvd0hlYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7dC5zdHJva2VTdHlsZT10aGlzLmdldENvbG9yKHQsZSxpLG8pLHQuZmlsbFN0eWxlPXQuc3Ryb2tlU3R5bGUsdC5saW5lV2lkdGg9ZS53aWR0aCxuLnR5cGUmJiJjaXJjbGUiPT09bi50eXBlLnRvTG93ZXJDYXNlKCk/dC5jaXJjbGVFbmRwb2ludChuLnBvaW50Lngsbi5wb2ludC55LG4uYW5nbGUsbi5sZW5ndGgpOnQuYXJyb3dFbmRwb2ludChuLnBvaW50Lngsbi5wb2ludC55LG4uYW5nbGUsbi5sZW5ndGgpLHRoaXMuZW5hYmxlU2hhZG93KHQsZSksdC5maWxsKCksdGhpcy5kaXNhYmxlU2hhZG93KHQsZSl9fSx7a2V5OiJlbmFibGVTaGFkb3ciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7ITA9PT1lLnNoYWRvdyYmKHQuc2hhZG93Q29sb3I9ZS5zaGFkb3dDb2xvcix0LnNoYWRvd0JsdXI9ZS5zaGFkb3dTaXplLHQuc2hhZG93T2Zmc2V0WD1lLnNoYWRvd1gsdC5zaGFkb3dPZmZzZXRZPWUuc2hhZG93WSl9fSx7a2V5OiJkaXNhYmxlU2hhZG93Iix2YWx1ZTpmdW5jdGlvbih0LGUpeyEwPT09ZS5zaGFkb3cmJih0LnNoYWRvd0NvbG9yPSJyZ2JhKDAsMCwwLDApIix0LnNoYWRvd0JsdXI9MCx0LnNoYWRvd09mZnNldFg9MCx0LnNoYWRvd09mZnNldFk9MCl9fV0pLHR9KCk7ZS5kZWZhdWx0PXV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzApLHM9byhuKSxyPWkoMTc1KSxhPW8ociksaD1pKDEzNCksZD1vKGgpLGw9aSgxMzUpLHU9byhsKSxjPWkoMTc4KSxwPW8oYyksZj1pKDE3OSksbT1vKGYpLHY9aSgyMDQpLGc9byh2KSx5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8peygwLGQuZGVmYXVsdCkodGhpcyxlKTt2YXIgbj0oMCxwLmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxhLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKTtyZXR1cm4gbi5fYm91bmRGdW5jdGlvbj1mdW5jdGlvbigpe24ucG9zaXRpb25CZXppZXJOb2RlKCl9LG4uYm9keS5lbWl0dGVyLm9uKCJfcmVwb3NpdGlvbkJlemllck5vZGVzIixuLl9ib3VuZEZ1bmN0aW9uKSxufXJldHVybigwLG0uZGVmYXVsdCkoZSx0KSwoMCx1LmRlZmF1bHQpKGUsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSExO3RoaXMub3B0aW9ucy5waHlzaWNzIT09dC5waHlzaWNzJiYoZT0hMCksdGhpcy5vcHRpb25zPXQsdGhpcy5pZD10aGlzLm9wdGlvbnMuaWQsdGhpcy5mcm9tPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMuZnJvbV0sdGhpcy50bz10aGlzLmJvZHkubm9kZXNbdGhpcy5vcHRpb25zLnRvXSx0aGlzLnNldHVwU3VwcG9ydE5vZGUoKSx0aGlzLmNvbm5lY3QoKSwhMD09PWUmJih0aGlzLnZpYS5zZXRPcHRpb25zKHtwaHlzaWNzOnRoaXMub3B0aW9ucy5waHlzaWNzfSksdGhpcy5wb3NpdGlvbkJlemllck5vZGUoKSl9fSx7a2V5OiJjb25uZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZnJvbT10aGlzLmJvZHkubm9kZXNbdGhpcy5vcHRpb25zLmZyb21dLHRoaXMudG89dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy50b10sdm9pZCAwPT09dGhpcy5mcm9tfHx2b2lkIDA9PT10aGlzLnRvfHwhMT09PXRoaXMub3B0aW9ucy5waHlzaWNzP3RoaXMudmlhLnNldE9wdGlvbnMoe3BoeXNpY3M6ITF9KTp0aGlzLmZyb20uaWQ9PT10aGlzLnRvLmlkP3RoaXMudmlhLnNldE9wdGlvbnMoe3BoeXNpY3M6ITF9KTp0aGlzLnZpYS5zZXRPcHRpb25zKHtwaHlzaWNzOiEwfSl9fSx7a2V5OiJjbGVhbnVwIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvZHkuZW1pdHRlci5vZmYoIl9yZXBvc2l0aW9uQmV6aWVyTm9kZXMiLHRoaXMuX2JvdW5kRnVuY3Rpb24pLHZvaWQgMCE9PXRoaXMudmlhJiYoZGVsZXRlIHRoaXMuYm9keS5ub2Rlc1t0aGlzLnZpYS5pZF0sdGhpcy52aWE9dm9pZCAwLCEwKX19LHtrZXk6InNldHVwU3VwcG9ydE5vZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy52aWEpe3ZhciB0PSJlZGdlSWQ6Iit0aGlzLmlkLGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlKHtpZDp0LHNoYXBlOiJjaXJjbGUiLHBoeXNpY3M6ITAsaGlkZGVuOiEwfSk7dGhpcy5ib2R5Lm5vZGVzW3RdPWUsdGhpcy52aWE9ZSx0aGlzLnZpYS5wYXJlbnRFZGdlSWQ9dGhpcy5pZCx0aGlzLnBvc2l0aW9uQmV6aWVyTm9kZSgpfX19LHtrZXk6InBvc2l0aW9uQmV6aWVyTm9kZSIsdmFsdWU6ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLnZpYSYmdm9pZCAwIT09dGhpcy5mcm9tJiZ2b2lkIDAhPT10aGlzLnRvPyh0aGlzLnZpYS54PS41Kih0aGlzLmZyb20ueCt0aGlzLnRvLngpLHRoaXMudmlhLnk9LjUqKHRoaXMuZnJvbS55K3RoaXMudG8ueSkpOnZvaWQgMCE9PXRoaXMudmlhJiYodGhpcy52aWEueD0wLHRoaXMudmlhLnk9MCl9fSx7a2V5OiJfbGluZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3QuYmVnaW5QYXRoKCksdC5tb3ZlVG8odGhpcy5mcm9tUG9pbnQueCx0aGlzLmZyb21Qb2ludC55KSx2b2lkIDA9PT1pLng/dC5saW5lVG8odGhpcy50b1BvaW50LngsdGhpcy50b1BvaW50LnkpOnQucXVhZHJhdGljQ3VydmVUbyhpLngsaS55LHRoaXMudG9Qb2ludC54LHRoaXMudG9Qb2ludC55KSx0aGlzLmVuYWJsZVNoYWRvdyh0LGUpLHQuc3Ryb2tlKCksdGhpcy5kaXNhYmxlU2hhZG93KHQsZSl9fSx7a2V5OiJnZXRWaWFOb2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpYX19LHtrZXk6ImdldFBvaW50Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy52aWEsaT10LG89dm9pZCAwLG49dm9pZCAwO2lmKHRoaXMuZnJvbT09PXRoaXMudG8pe3ZhciByPXRoaXMuX2dldENpcmNsZURhdGEodGhpcy5mcm9tKSxhPSgwLHMuZGVmYXVsdCkociwzKSxoPWFbMF0sZD1hWzFdLGw9YVsyXSx1PTIqTWF0aC5QSSooMS1pKTtvPWgrbCpNYXRoLnNpbih1KSxuPWQrbC1sKigxLU1hdGguY29zKHUpKX1lbHNlIG89TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LngrMippKigxLWkpKmUueCtNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC54LG49TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LnkrMippKigxLWkpKmUueStNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC55O3JldHVybnt4Om8seTpufX19LHtrZXk6Il9maW5kQm9yZGVyUG9zaXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbkJlemllcih0LGUsdGhpcy52aWEpfX0se2tleToiX2dldERpc3RhbmNlVG9FZGdlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7cmV0dXJuIHRoaXMuX2dldERpc3RhbmNlVG9CZXppZXJFZGdlKHQsZSxpLG8sbixzLHRoaXMudmlhKX19XSksZX0oZy5kZWZhdWx0KTtlLmRlZmF1bHQ9eX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDE3NSkscz1vKG4pLHI9aSgxMzQpLGE9byhyKSxoPWkoMTM1KSxkPW8oaCksbD1pKDE3OCksdT1vKGwpLGM9aSgxNzkpLHA9byhjKSxmPWkoMjA0KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleToiX2xpbmUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHRoaXMuZnJvbVBvaW50LngsdGhpcy5mcm9tUG9pbnQueSksdm9pZCAwPT09aS54P3QubGluZVRvKHRoaXMudG9Qb2ludC54LHRoaXMudG9Qb2ludC55KTp0LnF1YWRyYXRpY0N1cnZlVG8oaS54LGkueSx0aGlzLnRvUG9pbnQueCx0aGlzLnRvUG9pbnQueSksdGhpcy5lbmFibGVTaGFkb3codCxlKSx0LnN0cm9rZSgpLHRoaXMuZGlzYWJsZVNoYWRvdyh0LGUpfX0se2tleToiZ2V0VmlhTm9kZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKX19LHtrZXk6Il9nZXRWaWFDb29yZGluYXRlcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD12b2lkIDAsZT12b2lkIDAsaT10aGlzLm9wdGlvbnMuc21vb3RoLnJvdW5kbmVzcyxvPXRoaXMub3B0aW9ucy5zbW9vdGgudHlwZSxuPU1hdGguYWJzKHRoaXMuZnJvbS54LXRoaXMudG8ueCkscz1NYXRoLmFicyh0aGlzLmZyb20ueS10aGlzLnRvLnkpO2lmKCJkaXNjcmV0ZSI9PT1vfHwiZGlhZ29uYWxDcm9zcyI9PT1vKU1hdGguYWJzKHRoaXMuZnJvbS54LXRoaXMudG8ueCk8PU1hdGguYWJzKHRoaXMuZnJvbS55LXRoaXMudG8ueSk/KHRoaXMuZnJvbS55Pj10aGlzLnRvLnk/dGhpcy5mcm9tLng8PXRoaXMudG8ueD8odD10aGlzLmZyb20ueCtpKnMsZT10aGlzLmZyb20ueS1pKnMpOnRoaXMuZnJvbS54PnRoaXMudG8ueCYmKHQ9dGhpcy5mcm9tLngtaSpzLGU9dGhpcy5mcm9tLnktaSpzKTp0aGlzLmZyb20ueTx0aGlzLnRvLnkmJih0aGlzLmZyb20ueDw9dGhpcy50by54Pyh0PXRoaXMuZnJvbS54K2kqcyxlPXRoaXMuZnJvbS55K2kqcyk6dGhpcy5mcm9tLng+dGhpcy50by54JiYodD10aGlzLmZyb20ueC1pKnMsZT10aGlzLmZyb20ueStpKnMpKSwiZGlzY3JldGUiPT09byYmKHQ9bjxpKnM/dGhpcy5mcm9tLng6dCkpOk1hdGguYWJzKHRoaXMuZnJvbS54LXRoaXMudG8ueCk+TWF0aC5hYnModGhpcy5mcm9tLnktdGhpcy50by55KSYmKHRoaXMuZnJvbS55Pj10aGlzLnRvLnk/dGhpcy5mcm9tLng8PXRoaXMudG8ueD8odD10aGlzLmZyb20ueCtpKm4sZT10aGlzLmZyb20ueS1pKm4pOnRoaXMuZnJvbS54PnRoaXMudG8ueCYmKHQ9dGhpcy5mcm9tLngtaSpuLGU9dGhpcy5mcm9tLnktaSpuKTp0aGlzLmZyb20ueTx0aGlzLnRvLnkmJih0aGlzLmZyb20ueDw9dGhpcy50by54Pyh0PXRoaXMuZnJvbS54K2kqbixlPXRoaXMuZnJvbS55K2kqbik6dGhpcy5mcm9tLng+dGhpcy50by54JiYodD10aGlzLmZyb20ueC1pKm4sZT10aGlzLmZyb20ueStpKm4pKSwiZGlzY3JldGUiPT09byYmKGU9czxpKm4/dGhpcy5mcm9tLnk6ZSkpO2Vsc2UgaWYoInN0cmFpZ2h0Q3Jvc3MiPT09bylNYXRoLmFicyh0aGlzLmZyb20ueC10aGlzLnRvLngpPD1NYXRoLmFicyh0aGlzLmZyb20ueS10aGlzLnRvLnkpPyh0PXRoaXMuZnJvbS54LGU9dGhpcy5mcm9tLnk8dGhpcy50by55P3RoaXMudG8ueS0oMS1pKSpzOnRoaXMudG8ueSsoMS1pKSpzKTpNYXRoLmFicyh0aGlzLmZyb20ueC10aGlzLnRvLngpPk1hdGguYWJzKHRoaXMuZnJvbS55LXRoaXMudG8ueSkmJih0PXRoaXMuZnJvbS54PHRoaXMudG8ueD90aGlzLnRvLngtKDEtaSkqbjp0aGlzLnRvLngrKDEtaSkqbixlPXRoaXMuZnJvbS55KTtlbHNlIGlmKCJob3Jpem9udGFsIj09PW8pdD10aGlzLmZyb20ueDx0aGlzLnRvLng/dGhpcy50by54LSgxLWkpKm46dGhpcy50by54KygxLWkpKm4sZT10aGlzLmZyb20ueTtlbHNlIGlmKCJ2ZXJ0aWNhbCI9PT1vKXQ9dGhpcy5mcm9tLngsZT10aGlzLmZyb20ueTx0aGlzLnRvLnk/dGhpcy50by55LSgxLWkpKnM6dGhpcy50by55KygxLWkpKnM7ZWxzZSBpZigiY3VydmVkQ1ciPT09byl7bj10aGlzLnRvLngtdGhpcy5mcm9tLngscz10aGlzLmZyb20ueS10aGlzLnRvLnk7dmFyIHI9TWF0aC5zcXJ0KG4qbitzKnMpLGE9TWF0aC5QSSxoPU1hdGguYXRhbjIocyxuKSxkPShoKyguNSppKy41KSphKSUoMiphKTt0PXRoaXMuZnJvbS54KyguNSppKy41KSpyKk1hdGguc2luKGQpLGU9dGhpcy5mcm9tLnkrKC41KmkrLjUpKnIqTWF0aC5jb3MoZCl9ZWxzZSBpZigiY3VydmVkQ0NXIj09PW8pe249dGhpcy50by54LXRoaXMuZnJvbS54LHM9dGhpcy5mcm9tLnktdGhpcy50by55O3ZhciBsPU1hdGguc3FydChuKm4rcypzKSx1PU1hdGguUEksYz1NYXRoLmF0YW4yKHMsbikscD0oYysoLjUqLWkrLjUpKnUpJSgyKnUpO3Q9dGhpcy5mcm9tLngrKC41KmkrLjUpKmwqTWF0aC5zaW4ocCksZT10aGlzLmZyb20ueSsoLjUqaSsuNSkqbCpNYXRoLmNvcyhwKX1lbHNlIE1hdGguYWJzKHRoaXMuZnJvbS54LXRoaXMudG8ueCk8PU1hdGguYWJzKHRoaXMuZnJvbS55LXRoaXMudG8ueSk/dGhpcy5mcm9tLnk+PXRoaXMudG8ueT90aGlzLmZyb20ueDw9dGhpcy50by54Pyh0PXRoaXMuZnJvbS54K2kqcyxlPXRoaXMuZnJvbS55LWkqcyx0PXRoaXMudG8ueDx0P3RoaXMudG8ueDp0KTp0aGlzLmZyb20ueD50aGlzLnRvLngmJih0PXRoaXMuZnJvbS54LWkqcyxlPXRoaXMuZnJvbS55LWkqcyx0PXRoaXMudG8ueD50P3RoaXMudG8ueDp0KTp0aGlzLmZyb20ueTx0aGlzLnRvLnkmJih0aGlzLmZyb20ueDw9dGhpcy50by54Pyh0PXRoaXMuZnJvbS54K2kqcyxlPXRoaXMuZnJvbS55K2kqcyx0PXRoaXMudG8ueDx0P3RoaXMudG8ueDp0KTp0aGlzLmZyb20ueD50aGlzLnRvLngmJih0PXRoaXMuZnJvbS54LWkqcyxlPXRoaXMuZnJvbS55K2kqcyx0PXRoaXMudG8ueD50P3RoaXMudG8ueDp0KSk6TWF0aC5hYnModGhpcy5mcm9tLngtdGhpcy50by54KT5NYXRoLmFicyh0aGlzLmZyb20ueS10aGlzLnRvLnkpJiYodGhpcy5mcm9tLnk+PXRoaXMudG8ueT90aGlzLmZyb20ueDw9dGhpcy50by54Pyh0PXRoaXMuZnJvbS54K2kqbixlPXRoaXMuZnJvbS55LWkqbixlPXRoaXMudG8ueT5lP3RoaXMudG8ueTplKTp0aGlzLmZyb20ueD50aGlzLnRvLngmJih0PXRoaXMuZnJvbS54LWkqbixlPXRoaXMuZnJvbS55LWkqbixlPXRoaXMudG8ueT5lP3RoaXMudG8ueTplKTp0aGlzLmZyb20ueTx0aGlzLnRvLnkmJih0aGlzLmZyb20ueDw9dGhpcy50by54Pyh0PXRoaXMuZnJvbS54K2kqbixlPXRoaXMuZnJvbS55K2kqbixlPXRoaXMudG8ueTxlP3RoaXMudG8ueTplKTp0aGlzLmZyb20ueD50aGlzLnRvLngmJih0PXRoaXMuZnJvbS54LWkqbixlPXRoaXMuZnJvbS55K2kqbixlPXRoaXMudG8ueTxlP3RoaXMudG8ueTplKSkpO3JldHVybnt4OnQseTplfX19LHtrZXk6Il9maW5kQm9yZGVyUG9zaXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O3JldHVybiB0aGlzLl9maW5kQm9yZGVyUG9zaXRpb25CZXppZXIodCxlLGkudmlhKX19LHtrZXk6Il9nZXREaXN0YW5jZVRvRWRnZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+NiYmdm9pZCAwIT09YXJndW1lbnRzWzZdP2FyZ3VtZW50c1s2XTp0aGlzLl9nZXRWaWFDb29yZGluYXRlcygpO3JldHVybiB0aGlzLl9nZXREaXN0YW5jZVRvQmV6aWVyRWRnZSh0LGUsaSxvLG4scyxyKX19LHtrZXk6ImdldFBvaW50Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKSxpPXQ7cmV0dXJue3g6TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LngrMippKigxLWkpKmUueCtNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC54LHk6TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LnkrMippKigxLWkpKmUueStNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC55fX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDE3NSkscz1vKG4pLHI9aSgxMzQpLGE9byhyKSxoPWkoMTM1KSxkPW8oaCksbD1pKDE3OCksdT1vKGwpLGM9aSgxNzkpLHA9byhjKSxmPWkoMjA1KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleToiX2xpbmUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dC5iZWdpblBhdGgoKSx0Lm1vdmVUbyh0aGlzLmZyb21Qb2ludC54LHRoaXMuZnJvbVBvaW50LnkpLHQubGluZVRvKHRoaXMudG9Qb2ludC54LHRoaXMudG9Qb2ludC55KSx0aGlzLmVuYWJsZVNoYWRvdyh0LGUpLHQuc3Ryb2tlKCksdGhpcy5kaXNhYmxlU2hhZG93KHQsZSl9fSx7a2V5OiJnZXRWaWFOb2RlIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImdldFBvaW50Iix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm57eDooMS10KSp0aGlzLmZyb21Qb2ludC54K3QqdGhpcy50b1BvaW50LngseTooMS10KSp0aGlzLmZyb21Qb2ludC55K3QqdGhpcy50b1BvaW50Lnl9fX0se2tleToiX2ZpbmRCb3JkZXJQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnRvLG89dGhpcy5mcm9tO3QuaWQ9PT10aGlzLmZyb20uaWQmJihpPXRoaXMuZnJvbSxvPXRoaXMudG8pO3ZhciBuPU1hdGguYXRhbjIoaS55LW8ueSxpLngtby54KSxzPWkueC1vLngscj1pLnktby55LGE9TWF0aC5zcXJ0KHMqcytyKnIpLGg9dC5kaXN0YW5jZVRvQm9yZGVyKGUsbiksZD0oYS1oKS9hLGw9e307cmV0dXJuIGwueD0oMS1kKSpvLngrZCppLngsbC55PSgxLWQpKm8ueStkKmkueSxsfX0se2tleToiX2dldERpc3RhbmNlVG9FZGdlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7cmV0dXJuIHRoaXMuX2dldERpc3RhbmNlVG9MaW5lKHQsZSxpLG8sbixzKX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDU4KSxzPW8obikscj1pKDEzNCksYT1vKHIpLGg9aSgxMzUpLGQ9byhoKSxsPWkoMjEwKS5kZWZhdWx0LHU9aSgyMTEpLmRlZmF1bHQsYz1pKDIxMikuZGVmYXVsdCxwPWkoMjEzKS5kZWZhdWx0LGY9aSgyMTQpLmRlZmF1bHQsbT1pKDIxNSkuZGVmYXVsdCx2PWkoMjE2KS5kZWZhdWx0LGc9aSgyMTcpLmRlZmF1bHQseT1pKDEpLGI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpeygwLGEuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLnBoeXNpY3NCb2R5PXtwaHlzaWNzTm9kZUluZGljZXM6W10scGh5c2ljc0VkZ2VJbmRpY2VzOltdLGZvcmNlczp7fSx2ZWxvY2l0aWVzOnt9fSx0aGlzLnBoeXNpY3NFbmFibGVkPSEwLHRoaXMuc2ltdWxhdGlvbkludGVydmFsPTFlMy82MCx0aGlzLnJlcXVpcmVzVGltZW91dD0hMCx0aGlzLnByZXZpb3VzU3RhdGVzPXt9LHRoaXMucmVmZXJlbmNlU3RhdGU9e30sdGhpcy5mcmVlemVDYWNoZT17fSx0aGlzLnJlbmRlclRpbWVyPXZvaWQgMCx0aGlzLmFkYXB0aXZlVGltZXN0ZXA9ITEsdGhpcy5hZGFwdGl2ZVRpbWVzdGVwRW5hYmxlZD0hMSx0aGlzLmFkYXB0aXZlQ291bnRlcj0wLHRoaXMuYWRhcHRpdmVJbnRlcnZhbD0zLHRoaXMuc3RhYmlsaXplZD0hMSx0aGlzLnN0YXJ0ZWRTdGFiaWxpemF0aW9uPSExLHRoaXMuc3RhYmlsaXphdGlvbkl0ZXJhdGlvbnM9MCx0aGlzLnJlYWR5PSExLHRoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXtlbmFibGVkOiEwLGJhcm5lc0h1dDp7dGhldGE6LjUsZ3Jhdml0YXRpb25hbENvbnN0YW50Oi0yZTMsY2VudHJhbEdyYXZpdHk6LjMsc3ByaW5nTGVuZ3RoOjk1LHNwcmluZ0NvbnN0YW50Oi4wNCxkYW1waW5nOi4wOSxhdm9pZE92ZXJsYXA6MH0sZm9yY2VBdGxhczJCYXNlZDp7dGhldGE6LjUsZ3Jhdml0YXRpb25hbENvbnN0YW50Oi01MCxjZW50cmFsR3Jhdml0eTouMDEsc3ByaW5nQ29uc3RhbnQ6LjA4LHNwcmluZ0xlbmd0aDoxMDAsZGFtcGluZzouNCxhdm9pZE92ZXJsYXA6MH0scmVwdWxzaW9uOntjZW50cmFsR3Jhdml0eTouMixzcHJpbmdMZW5ndGg6MjAwLHNwcmluZ0NvbnN0YW50Oi4wNSxub2RlRGlzdGFuY2U6MTAwLGRhbXBpbmc6LjA5LGF2b2lkT3ZlcmxhcDowfSxoaWVyYXJjaGljYWxSZXB1bHNpb246e2NlbnRyYWxHcmF2aXR5OjAsc3ByaW5nTGVuZ3RoOjEwMCxzcHJpbmdDb25zdGFudDouMDEsbm9kZURpc3RhbmNlOjEyMCxkYW1waW5nOi4wOX0sbWF4VmVsb2NpdHk6NTAsbWluVmVsb2NpdHk6Ljc1LHNvbHZlcjoiYmFybmVzSHV0IixzdGFiaWxpemF0aW9uOntlbmFibGVkOiEwLGl0ZXJhdGlvbnM6MWUzLHVwZGF0ZUludGVydmFsOjUwLG9ubHlEeW5hbWljRWRnZXM6ITEsZml0OiEwfSx0aW1lc3RlcDouNSxhZGFwdGl2ZVRpbWVzdGVwOiEwfSx5LmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy50aW1lc3RlcD0uNSx0aGlzLmxheW91dEZhaWxlZD0hMSx0aGlzLmJpbmRFdmVudExpc3RlbmVycygpfXJldHVybigwLGQuZGVmYXVsdCkodCxbe2tleToiYmluZEV2ZW50TGlzdGVuZXJzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub24oImluaXRQaHlzaWNzIixmdW5jdGlvbigpe3QuaW5pdFBoeXNpY3MoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJfbGF5b3V0RmFpbGVkIixmdW5jdGlvbigpe3QubGF5b3V0RmFpbGVkPSEwfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oInJlc2V0UGh5c2ljcyIsZnVuY3Rpb24oKXt0LnN0b3BTaW11bGF0aW9uKCksdC5yZWFkeT0hMX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJkaXNhYmxlUGh5c2ljcyIsZnVuY3Rpb24oKXt0LnBoeXNpY3NFbmFibGVkPSExLHQuc3RvcFNpbXVsYXRpb24oKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJyZXN0b3JlUGh5c2ljcyIsZnVuY3Rpb24oKXt0LnNldE9wdGlvbnModC5vcHRpb25zKSwhMD09PXQucmVhZHkmJnQuc3RhcnRTaW11bGF0aW9uKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigic3RhcnRTaW11bGF0aW9uIixmdW5jdGlvbigpeyEwPT09dC5yZWFkeSYmdC5zdGFydFNpbXVsYXRpb24oKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJzdG9wU2ltdWxhdGlvbiIsZnVuY3Rpb24oKXt0LnN0b3BTaW11bGF0aW9uKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXt0LnN0b3BTaW11bGF0aW9uKCExKSx0LmJvZHkuZW1pdHRlci5vZmYoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJfZGF0YUNoYW5nZWQiLGZ1bmN0aW9uKCl7dC51cGRhdGVQaHlzaWNzRGF0YSgpfSl9fSx7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2b2lkIDAhPT10JiYoITE9PT10Pyh0aGlzLm9wdGlvbnMuZW5hYmxlZD0hMSx0aGlzLnBoeXNpY3NFbmFibGVkPSExLHRoaXMuc3RvcFNpbXVsYXRpb24oKSk6KHRoaXMucGh5c2ljc0VuYWJsZWQ9ITAseS5zZWxlY3RpdmVOb3REZWVwRXh0ZW5kKFsic3RhYmlsaXphdGlvbiJdLHRoaXMub3B0aW9ucyx0KSx5Lm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCwic3RhYmlsaXphdGlvbiIpLHZvaWQgMD09PXQuZW5hYmxlZCYmKHRoaXMub3B0aW9ucy5lbmFibGVkPSEwKSwhMT09PXRoaXMub3B0aW9ucy5lbmFibGVkJiYodGhpcy5waHlzaWNzRW5hYmxlZD0hMSx0aGlzLnN0b3BTaW11bGF0aW9uKCkpLHRoaXMudGltZXN0ZXA9dGhpcy5vcHRpb25zLnRpbWVzdGVwKSksdGhpcy5pbml0KCl9fSx7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0OyJmb3JjZUF0bGFzMkJhc2VkIj09PXRoaXMub3B0aW9ucy5zb2x2ZXI/KHQ9dGhpcy5vcHRpb25zLmZvcmNlQXRsYXMyQmFzZWQsdGhpcy5ub2Rlc1NvbHZlcj1uZXcgdih0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSx0aGlzLmVkZ2VzU29sdmVyPW5ldyBwKHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpLHRoaXMuZ3Jhdml0eVNvbHZlcj1uZXcgZyh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSk6InJlcHVsc2lvbiI9PT10aGlzLm9wdGlvbnMuc29sdmVyPyh0PXRoaXMub3B0aW9ucy5yZXB1bHNpb24sdGhpcy5ub2Rlc1NvbHZlcj1uZXcgdSh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSx0aGlzLmVkZ2VzU29sdmVyPW5ldyBwKHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpLHRoaXMuZ3Jhdml0eVNvbHZlcj1uZXcgbSh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSk6ImhpZXJhcmNoaWNhbFJlcHVsc2lvbiI9PT10aGlzLm9wdGlvbnMuc29sdmVyPyh0PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWxSZXB1bHNpb24sdGhpcy5ub2Rlc1NvbHZlcj1uZXcgYyh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSx0aGlzLmVkZ2VzU29sdmVyPW5ldyBmKHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpLHRoaXMuZ3Jhdml0eVNvbHZlcj1uZXcgbSh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSk6KHQ9dGhpcy5vcHRpb25zLmJhcm5lc0h1dCx0aGlzLm5vZGVzU29sdmVyPW5ldyBsKHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpLHRoaXMuZWRnZXNTb2x2ZXI9bmV3IHAodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCksdGhpcy5ncmF2aXR5U29sdmVyPW5ldyBtKHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpKSx0aGlzLm1vZGVsT3B0aW9ucz10fX0se2tleToiaW5pdFBoeXNpY3MiLHZhbHVlOmZ1bmN0aW9uKCl7ITA9PT10aGlzLnBoeXNpY3NFbmFibGVkJiYhMD09PXRoaXMub3B0aW9ucy5lbmFibGVkPyEwPT09dGhpcy5vcHRpb25zLnN0YWJpbGl6YXRpb24uZW5hYmxlZD90aGlzLnN0YWJpbGl6ZSgpOih0aGlzLnN0YWJpbGl6ZWQ9ITEsdGhpcy5yZWFkeT0hMCx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJmaXQiLHt9LHRoaXMubGF5b3V0RmFpbGVkKSx0aGlzLnN0YXJ0U2ltdWxhdGlvbigpKToodGhpcy5yZWFkeT0hMCx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJmaXQiKSl9fSx7a2V5OiJzdGFydFNpbXVsYXRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7ITA9PT10aGlzLnBoeXNpY3NFbmFibGVkJiYhMD09PXRoaXMub3B0aW9ucy5lbmFibGVkPyh0aGlzLnN0YWJpbGl6ZWQ9ITEsdGhpcy5hZGFwdGl2ZVRpbWVzdGVwPSExLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXNpemVOb2RlcyIpLHZvaWQgMD09PXRoaXMudmlld0Z1bmN0aW9uJiYodGhpcy52aWV3RnVuY3Rpb249dGhpcy5zaW11bGF0aW9uU3RlcC5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJpbml0UmVkcmF3Iix0aGlzLnZpZXdGdW5jdGlvbiksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3N0YXJ0UmVuZGVyaW5nIikpKTp0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfcmVkcmF3Iil9fSx7a2V5OiJzdG9wU2ltdWxhdGlvbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0hKGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdKXx8YXJndW1lbnRzWzBdO3RoaXMuc3RhYmlsaXplZD0hMCwhMD09PXQmJnRoaXMuX2VtaXRTdGFiaWxpemVkKCksdm9pZCAwIT09dGhpcy52aWV3RnVuY3Rpb24mJih0aGlzLmJvZHkuZW1pdHRlci5vZmYoImluaXRSZWRyYXciLHRoaXMudmlld0Z1bmN0aW9uKSx0aGlzLnZpZXdGdW5jdGlvbj12b2lkIDAsITA9PT10JiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfc3RvcFJlbmRlcmluZyIpKX19LHtrZXk6InNpbXVsYXRpb25TdGVwIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PURhdGUubm93KCk7dGhpcy5waHlzaWNzVGljaygpLChEYXRlLm5vdygpLXQ8LjQqdGhpcy5zaW11bGF0aW9uSW50ZXJ2YWx8fCEwPT09dGhpcy5ydW5Eb3VibGVTcGVlZCkmJiExPT09dGhpcy5zdGFiaWxpemVkJiYodGhpcy5waHlzaWNzVGljaygpLHRoaXMucnVuRG91YmxlU3BlZWQ9ITApLCEwPT09dGhpcy5zdGFiaWxpemVkJiZ0aGlzLnN0b3BTaW11bGF0aW9uKCl9fSx7a2V5OiJfZW1pdFN0YWJpbGl6ZWQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp0aGlzLnN0YWJpbGl6YXRpb25JdGVyYXRpb25zOyh0aGlzLnN0YWJpbGl6YXRpb25JdGVyYXRpb25zPjF8fCEwPT09dGhpcy5zdGFydGVkU3RhYmlsaXphdGlvbikmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmJvZHkuZW1pdHRlci5lbWl0KCJzdGFiaWxpemVkIix7aXRlcmF0aW9uczplfSksdC5zdGFydGVkU3RhYmlsaXphdGlvbj0hMSx0LnN0YWJpbGl6YXRpb25JdGVyYXRpb25zPTB9LDApfX0se2tleToicGh5c2ljc1RpY2siLHZhbHVlOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLnN0YXJ0ZWRTdGFiaWxpemF0aW9uJiYodGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgic3RhcnRTdGFiaWxpemluZyIpLHRoaXMuc3RhcnRlZFN0YWJpbGl6YXRpb249ITApLCExPT09dGhpcy5zdGFiaWxpemVkKXtpZighMD09PXRoaXMuYWRhcHRpdmVUaW1lc3RlcCYmITA9PT10aGlzLmFkYXB0aXZlVGltZXN0ZXBFbmFibGVkKXt0aGlzLmFkYXB0aXZlQ291bnRlciV0aGlzLmFkYXB0aXZlSW50ZXJ2YWw9PTA/KHRoaXMudGltZXN0ZXA9Mip0aGlzLnRpbWVzdGVwLHRoaXMuY2FsY3VsYXRlRm9yY2VzKCksdGhpcy5tb3ZlTm9kZXMoKSx0aGlzLnJldmVydCgpLHRoaXMudGltZXN0ZXA9LjUqdGhpcy50aW1lc3RlcCx0aGlzLmNhbGN1bGF0ZUZvcmNlcygpLHRoaXMubW92ZU5vZGVzKCksdGhpcy5jYWxjdWxhdGVGb3JjZXMoKSx0aGlzLm1vdmVOb2RlcygpLCEwPT09dGhpcy5fZXZhbHVhdGVTdGVwUXVhbGl0eSgpP3RoaXMudGltZXN0ZXA9MS4yKnRoaXMudGltZXN0ZXA6dGhpcy50aW1lc3RlcC8xLjI8dGhpcy5vcHRpb25zLnRpbWVzdGVwP3RoaXMudGltZXN0ZXA9dGhpcy5vcHRpb25zLnRpbWVzdGVwOih0aGlzLmFkYXB0aXZlQ291bnRlcj0tMSx0aGlzLnRpbWVzdGVwPU1hdGgubWF4KHRoaXMub3B0aW9ucy50aW1lc3RlcCx0aGlzLnRpbWVzdGVwLzEuMikpKToodGhpcy5jYWxjdWxhdGVGb3JjZXMoKSx0aGlzLm1vdmVOb2RlcygpKSx0aGlzLmFkYXB0aXZlQ291bnRlcis9MX1lbHNlIHRoaXMudGltZXN0ZXA9dGhpcy5vcHRpb25zLnRpbWVzdGVwLHRoaXMuY2FsY3VsYXRlRm9yY2VzKCksdGhpcy5tb3ZlTm9kZXMoKTshMD09PXRoaXMuc3RhYmlsaXplZCYmdGhpcy5yZXZlcnQoKSx0aGlzLnN0YWJpbGl6YXRpb25JdGVyYXRpb25zKyt9fX0se2tleToidXBkYXRlUGh5c2ljc0RhdGEiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5waHlzaWNzQm9keS5mb3JjZXM9e30sdGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXM9W10sdGhpcy5waHlzaWNzQm9keS5waHlzaWNzRWRnZUluZGljZXM9W107dmFyIHQ9dGhpcy5ib2R5Lm5vZGVzLGU9dGhpcy5ib2R5LmVkZ2VzO2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJiEwPT09dFtpXS5vcHRpb25zLnBoeXNpY3MmJnRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLnB1c2godFtpXS5pZCk7Zm9yKHZhciBvIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShvKSYmITA9PT1lW29dLm9wdGlvbnMucGh5c2ljcyYmdGhpcy5waHlzaWNzQm9keS5waHlzaWNzRWRnZUluZGljZXMucHVzaChlW29dLmlkKTtmb3IodmFyIG49MDtuPHRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLmxlbmd0aDtuKyspe3ZhciBzPXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzW25dO3RoaXMucGh5c2ljc0JvZHkuZm9yY2VzW3NdPXt4OjAseTowfSx2b2lkIDA9PT10aGlzLnBoeXNpY3NCb2R5LnZlbG9jaXRpZXNbc10mJih0aGlzLnBoeXNpY3NCb2R5LnZlbG9jaXRpZXNbc109e3g6MCx5OjB9KX1mb3IodmFyIHIgaW4gdGhpcy5waHlzaWNzQm9keS52ZWxvY2l0aWVzKXZvaWQgMD09PXRbcl0mJmRlbGV0ZSB0aGlzLnBoeXNpY3NCb2R5LnZlbG9jaXRpZXNbcl19fSx7a2V5OiJyZXZlcnQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9KDAscy5kZWZhdWx0KSh0aGlzLnByZXZpb3VzU3RhdGVzKSxlPXRoaXMuYm9keS5ub2RlcyxpPXRoaXMucGh5c2ljc0JvZHkudmVsb2NpdGllczt0aGlzLnJlZmVyZW5jZVN0YXRlPXt9O2Zvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKXt2YXIgbj10W29dO3ZvaWQgMCE9PWVbbl0/ITA9PT1lW25dLm9wdGlvbnMucGh5c2ljcyYmKHRoaXMucmVmZXJlbmNlU3RhdGVbbl09e3Bvc2l0aW9uczp7eDplW25dLngseTplW25dLnl9fSxpW25dLng9dGhpcy5wcmV2aW91c1N0YXRlc1tuXS52eCxpW25dLnk9dGhpcy5wcmV2aW91c1N0YXRlc1tuXS52eSxlW25dLng9dGhpcy5wcmV2aW91c1N0YXRlc1tuXS54LGVbbl0ueT10aGlzLnByZXZpb3VzU3RhdGVzW25dLnkpOmRlbGV0ZSB0aGlzLnByZXZpb3VzU3RhdGVzW25dfX19LHtrZXk6Il9ldmFsdWF0ZVN0ZXBRdWFsaXR5Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXZvaWQgMCxlPXZvaWQgMCxpPXRoaXMuYm9keS5ub2RlcyxvPXRoaXMucmVmZXJlbmNlU3RhdGU7Zm9yKHZhciBuIGluIHRoaXMucmVmZXJlbmNlU3RhdGUpaWYodGhpcy5yZWZlcmVuY2VTdGF0ZS5oYXNPd25Qcm9wZXJ0eShuKSYmdm9pZCAwIT09aVtuXSYmKHQ9aVtuXS54LW9bbl0ucG9zaXRpb25zLngsZT1pW25dLnktb1tuXS5wb3NpdGlvbnMueSxNYXRoLnNxcnQoTWF0aC5wb3codCwyKStNYXRoLnBvdyhlLDIpKT4uMykpcmV0dXJuITE7cmV0dXJuITB9fSx7a2V5OiJtb3ZlTm9kZXMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLGU9dGhpcy5vcHRpb25zLm1heFZlbG9jaXR5P3RoaXMub3B0aW9ucy5tYXhWZWxvY2l0eToxZTksaT0wLG89MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl0scj10aGlzLl9wZXJmb3JtU3RlcChzLGUpO2k9TWF0aC5tYXgoaSxyKSxvKz1yfXRoaXMuYWRhcHRpdmVUaW1lc3RlcEVuYWJsZWQ9by90Lmxlbmd0aDw1LHRoaXMuc3RhYmlsaXplZD1pPHRoaXMub3B0aW9ucy5taW5WZWxvY2l0eX19LHtrZXk6Il9wZXJmb3JtU3RlcCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmJvZHkubm9kZXNbdF0sbz10aGlzLnRpbWVzdGVwLG49dGhpcy5waHlzaWNzQm9keS5mb3JjZXMscz10aGlzLnBoeXNpY3NCb2R5LnZlbG9jaXRpZXM7aWYodGhpcy5wcmV2aW91c1N0YXRlc1t0XT17eDppLngseTppLnksdng6c1t0XS54LHZ5OnNbdF0ueX0sITE9PT1pLm9wdGlvbnMuZml4ZWQueCl7dmFyIHI9dGhpcy5tb2RlbE9wdGlvbnMuZGFtcGluZypzW3RdLngsYT0oblt0XS54LXIpL2kub3B0aW9ucy5tYXNzO3NbdF0ueCs9YSpvLHNbdF0ueD1NYXRoLmFicyhzW3RdLngpPmU/c1t0XS54PjA/ZTotZTpzW3RdLngsaS54Kz1zW3RdLngqb31lbHNlIG5bdF0ueD0wLHNbdF0ueD0wO2lmKCExPT09aS5vcHRpb25zLmZpeGVkLnkpe3ZhciBoPXRoaXMubW9kZWxPcHRpb25zLmRhbXBpbmcqc1t0XS55LGQ9KG5bdF0ueS1oKS9pLm9wdGlvbnMubWFzcztzW3RdLnkrPWQqbyxzW3RdLnk9TWF0aC5hYnMoc1t0XS55KT5lP3NbdF0ueT4wP2U6LWU6c1t0XS55LGkueSs9c1t0XS55Km99ZWxzZSBuW3RdLnk9MCxzW3RdLnk9MDtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHNbdF0ueCwyKStNYXRoLnBvdyhzW3RdLnksMikpfX0se2tleToiY2FsY3VsYXRlRm9yY2VzIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZ3Jhdml0eVNvbHZlci5zb2x2ZSgpLHRoaXMubm9kZXNTb2x2ZXIuc29sdmUoKSx0aGlzLmVkZ2VzU29sdmVyLnNvbHZlKCl9fSx7a2V5OiJfZnJlZXplTm9kZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ib2R5Lm5vZGVzO2Zvcih2YXIgZSBpbiB0KXQuaGFzT3duUHJvcGVydHkoZSkmJnRbZV0ueCYmdFtlXS55JiYodGhpcy5mcmVlemVDYWNoZVtlXT17eDp0W2VdLm9wdGlvbnMuZml4ZWQueCx5OnRbZV0ub3B0aW9ucy5maXhlZC55fSx0W2VdLm9wdGlvbnMuZml4ZWQueD0hMCx0W2VdLm9wdGlvbnMuZml4ZWQueT0hMCl9fSx7a2V5OiJfcmVzdG9yZUZyb3plbk5vZGVzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS5ub2Rlcztmb3IodmFyIGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiZ2b2lkIDAhPT10aGlzLmZyZWV6ZUNhY2hlW2VdJiYodFtlXS5vcHRpb25zLmZpeGVkLng9dGhpcy5mcmVlemVDYWNoZVtlXS54LHRbZV0ub3B0aW9ucy5maXhlZC55PXRoaXMuZnJlZXplQ2FjaGVbZV0ueSk7dGhpcy5mcmVlemVDYWNoZT17fX19LHtrZXk6InN0YWJpbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLml0ZXJhdGlvbnM7aWYoIm51bWJlciIhPXR5cGVvZiBlJiYoY29uc29sZS5sb2coIlRoZSBzdGFiaWxpemUgbWV0aG9kIG5lZWRzIGEgbnVtZXJpYyBhbW91bnQgb2YgaXRlcmF0aW9ucy4gU3dpdGNoaW5nIHRvIGRlZmF1bHQ6ICIsdGhpcy5vcHRpb25zLnN0YWJpbGl6YXRpb24uaXRlcmF0aW9ucyksZT10aGlzLm9wdGlvbnMuc3RhYmlsaXphdGlvbi5pdGVyYXRpb25zKSwwPT09dGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXMubGVuZ3RoKXJldHVybiB2b2lkKHRoaXMucmVhZHk9ITApO3RoaXMuYWRhcHRpdmVUaW1lc3RlcD10aGlzLm9wdGlvbnMuYWRhcHRpdmVUaW1lc3RlcCx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfcmVzaXplTm9kZXMiKSx0aGlzLnN0b3BTaW11bGF0aW9uKCksdGhpcy5zdGFiaWxpemVkPSExLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9ibG9ja1JlZHJhdyIpLHRoaXMudGFyZ2V0SXRlcmF0aW9ucz1lLCEwPT09dGhpcy5vcHRpb25zLnN0YWJpbGl6YXRpb24ub25seUR5bmFtaWNFZGdlcyYmdGhpcy5fZnJlZXplTm9kZXMoKSx0aGlzLnN0YWJpbGl6YXRpb25JdGVyYXRpb25zPTAsc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB0Ll9zdGFiaWxpemF0aW9uQmF0Y2goKX0sMCl9fSx7a2V5OiJfc3RhYmlsaXphdGlvbkJhdGNoIix2YWx1ZTpmdW5jdGlvbigpeyExPT09dGhpcy5zdGFydGVkU3RhYmlsaXphdGlvbiYmKHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInN0YXJ0U3RhYmlsaXppbmciKSx0aGlzLnN0YXJ0ZWRTdGFiaWxpemF0aW9uPSEwKTtmb3IodmFyIHQ9MDshMT09PXRoaXMuc3RhYmlsaXplZCYmdDx0aGlzLm9wdGlvbnMuc3RhYmlsaXphdGlvbi51cGRhdGVJbnRlcnZhbCYmdGhpcy5zdGFiaWxpemF0aW9uSXRlcmF0aW9uczx0aGlzLnRhcmdldEl0ZXJhdGlvbnM7KXRoaXMucGh5c2ljc1RpY2soKSx0Kys7ITE9PT10aGlzLnN0YWJpbGl6ZWQmJnRoaXMuc3RhYmlsaXphdGlvbkl0ZXJhdGlvbnM8dGhpcy50YXJnZXRJdGVyYXRpb25zPyh0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzdGFiaWxpemF0aW9uUHJvZ3Jlc3MiLHtpdGVyYXRpb25zOnRoaXMuc3RhYmlsaXphdGlvbkl0ZXJhdGlvbnMsdG90YWw6dGhpcy50YXJnZXRJdGVyYXRpb25zfSksc2V0VGltZW91dCh0aGlzLl9zdGFiaWxpemF0aW9uQmF0Y2guYmluZCh0aGlzKSwwKSk6dGhpcy5fZmluYWxpemVTdGFiaWxpemF0aW9uKCl9fSx7a2V5OiJfZmluYWxpemVTdGFiaWxpemF0aW9uIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9hbGxvd1JlZHJhdyIpLCEwPT09dGhpcy5vcHRpb25zLnN0YWJpbGl6YXRpb24uZml0JiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJmaXQiKSwhMD09PXRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLm9ubHlEeW5hbWljRWRnZXMmJnRoaXMuX3Jlc3RvcmVGcm96ZW5Ob2RlcygpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInN0YWJpbGl6YXRpb25JdGVyYXRpb25zRG9uZSIpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXF1ZXN0UmVkcmF3IiksITA9PT10aGlzLnN0YWJpbGl6ZWQ/dGhpcy5fZW1pdFN0YWJpbGl6ZWQoKTp0aGlzLnN0YXJ0U2ltdWxhdGlvbigpLHRoaXMucmVhZHk9ITB9fSx7a2V5OiJfZHJhd0ZvcmNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcy5sZW5ndGg7ZSsrKXt2YXIgaT10aGlzLmJvZHkubm9kZXNbdGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXNbZV1dLG89dGhpcy5waHlzaWNzQm9keS5mb3JjZXNbdGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXNbZV1dLG49TWF0aC5zcXJ0KE1hdGgucG93KG8ueCwyKStNYXRoLnBvdyhvLngsMikpLHM9TWF0aC5taW4oTWF0aC5tYXgoNSxuKSwxNSkscj0zKnMsYT15LkhTVlRvSGV4KCgxODAtMTgwKk1hdGgubWluKDEsTWF0aC5tYXgoMCwuMDMqbikpKS8zNjAsMSwxKTt0LmxpbmVXaWR0aD1zLHQuc3Ryb2tlU3R5bGU9YSx0LmJlZ2luUGF0aCgpLHQubW92ZVRvKGkueCxpLnkpLHQubGluZVRvKGkueCsyMCpvLngsaS55KzIwKm8ueSksdC5zdHJva2UoKTt2YXIgaD1NYXRoLmF0YW4yKG8ueSxvLngpO3QuZmlsbFN0eWxlPWEsdC5hcnJvd0VuZHBvaW50KGkueCsyMCpvLngrTWF0aC5jb3MoaCkqcixpLnkrMjAqby55K01hdGguc2luKGgpKnIsaCxyKSx0LmZpbGwoKX19fV0pLHR9KCk7ZS5kZWZhdWx0PWJ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxMzQpLHM9byhuKSxyPWkoMTM1KSxhPW8ociksaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8peygwLHMuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLnBoeXNpY3NCb2R5PWksdGhpcy5iYXJuZXNIdXRUcmVlLHRoaXMuc2V0T3B0aW9ucyhvKSx0aGlzLnJhbmRvbVNlZWQ9NX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10LHRoaXMudGhldGFJbnZlcnNlZD0xL3RoaXMub3B0aW9ucy50aGV0YSx0aGlzLm92ZXJsYXBBdm9pZGFuY2VGYWN0b3I9MS1NYXRoLm1heCgwLE1hdGgubWluKDEsdGhpcy5vcHRpb25zLmF2b2lkT3ZlcmxhcCkpfX0se2tleToic2VlZGVkUmFuZG9tIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PTFlNCpNYXRoLnNpbih0aGlzLnJhbmRvbVNlZWQrKyk7cmV0dXJuIHQtTWF0aC5mbG9vcih0KX19LHtrZXk6InNvbHZlIix2YWx1ZTpmdW5jdGlvbigpe2lmKDAhPT10aGlzLm9wdGlvbnMuZ3Jhdml0YXRpb25hbENvbnN0YW50JiZ0aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcy5sZW5ndGg+MCl7dmFyIHQ9dm9pZCAwLGU9dGhpcy5ib2R5Lm5vZGVzLGk9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXMsbz1pLmxlbmd0aCxuPXRoaXMuX2Zvcm1CYXJuZXNIdXRUcmVlKGUsaSk7dGhpcy5iYXJuZXNIdXRUcmVlPW47Zm9yKHZhciBzPTA7czxvO3MrKyl0PWVbaVtzXV0sdC5vcHRpb25zLm1hc3M+MCYmKHRoaXMuX2dldEZvcmNlQ29udHJpYnV0aW9uKG4ucm9vdC5jaGlsZHJlbi5OVyx0KSx0aGlzLl9nZXRGb3JjZUNvbnRyaWJ1dGlvbihuLnJvb3QuY2hpbGRyZW4uTkUsdCksdGhpcy5fZ2V0Rm9yY2VDb250cmlidXRpb24obi5yb290LmNoaWxkcmVuLlNXLHQpLHRoaXMuX2dldEZvcmNlQ29udHJpYnV0aW9uKG4ucm9vdC5jaGlsZHJlbi5TRSx0KSl9fX0se2tleToiX2dldEZvcmNlQ29udHJpYnV0aW9uIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHQuY2hpbGRyZW5Db3VudD4wKXt2YXIgaT12b2lkIDAsbz12b2lkIDAsbj12b2lkIDA7aT10LmNlbnRlck9mTWFzcy54LWUueCxvPXQuY2VudGVyT2ZNYXNzLnktZS55LG49TWF0aC5zcXJ0KGkqaStvKm8pLG4qdC5jYWxjU2l6ZT50aGlzLnRoZXRhSW52ZXJzZWQ/dGhpcy5fY2FsY3VsYXRlRm9yY2VzKG4saSxvLGUsdCk6ND09PXQuY2hpbGRyZW5Db3VudD8odGhpcy5fZ2V0Rm9yY2VDb250cmlidXRpb24odC5jaGlsZHJlbi5OVyxlKSx0aGlzLl9nZXRGb3JjZUNvbnRyaWJ1dGlvbih0LmNoaWxkcmVuLk5FLGUpLHRoaXMuX2dldEZvcmNlQ29udHJpYnV0aW9uKHQuY2hpbGRyZW4uU1csZSksdGhpcy5fZ2V0Rm9yY2VDb250cmlidXRpb24odC5jaGlsZHJlbi5TRSxlKSk6dC5jaGlsZHJlbi5kYXRhLmlkIT1lLmlkJiZ0aGlzLl9jYWxjdWxhdGVGb3JjZXMobixpLG8sZSx0KX19fSx7a2V5OiJfY2FsY3VsYXRlRm9yY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pezA9PT10JiYodD0uMSxlPXQpLHRoaXMub3ZlcmxhcEF2b2lkYW5jZUZhY3RvcjwxJiZvLnNoYXBlLnJhZGl1cyYmKHQ9TWF0aC5tYXgoLjErdGhpcy5vdmVybGFwQXZvaWRhbmNlRmFjdG9yKm8uc2hhcGUucmFkaXVzLHQtby5zaGFwZS5yYWRpdXMpKTt2YXIgcz10aGlzLm9wdGlvbnMuZ3Jhdml0YXRpb25hbENvbnN0YW50Km4ubWFzcypvLm9wdGlvbnMubWFzcy9NYXRoLnBvdyh0LDMpLHI9ZSpzLGE9aSpzO3RoaXMucGh5c2ljc0JvZHkuZm9yY2VzW28uaWRdLngrPXIsdGhpcy5waHlzaWNzQm9keS5mb3JjZXNbby5pZF0ueSs9YX19LHtrZXk6Il9mb3JtQmFybmVzSHV0VHJlZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dm9pZCAwLG89ZS5sZW5ndGgsbj10W2VbMF1dLngscz10W2VbMF1dLnkscj10W2VbMF1dLngsYT10W2VbMF1dLnksaD0xO2g8bztoKyspe3ZhciBkPXRbZVtoXV0ueCxsPXRbZVtoXV0ueTt0W2VbaF1dLm9wdGlvbnMubWFzcz4wJiYoZDxuJiYobj1kKSxkPnImJihyPWQpLGw8cyYmKHM9bCksbD5hJiYoYT1sKSl9dmFyIHU9TWF0aC5hYnMoci1uKS1NYXRoLmFicyhhLXMpO3U+MD8ocy09LjUqdSxhKz0uNSp1KToobis9LjUqdSxyLT0uNSp1KTt2YXIgYz1NYXRoLm1heCgxZS01LE1hdGguYWJzKHItbikpLHA9LjUqYyxmPS41KihuK3IpLG09LjUqKHMrYSksdj17cm9vdDp7Y2VudGVyT2ZNYXNzOnt4OjAseTowfSxtYXNzOjAscmFuZ2U6e21pblg6Zi1wLG1heFg6ZitwLG1pblk6bS1wLG1heFk6bStwfSxzaXplOmMsY2FsY1NpemU6MS9jLGNoaWxkcmVuOntkYXRhOm51bGx9LG1heFdpZHRoOjAsbGV2ZWw6MCxjaGlsZHJlbkNvdW50OjR9fTt0aGlzLl9zcGxpdEJyYW5jaCh2LnJvb3QpO2Zvcih2YXIgZz0wO2c8bztnKyspaT10W2VbZ11dLGkub3B0aW9ucy5tYXNzPjAmJnRoaXMuX3BsYWNlSW5UcmVlKHYucm9vdCxpKTtyZXR1cm4gdn19LHtrZXk6Il91cGRhdGVCcmFuY2hNYXNzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXQubWFzcytlLm9wdGlvbnMubWFzcyxvPTEvaTt0LmNlbnRlck9mTWFzcy54PXQuY2VudGVyT2ZNYXNzLngqdC5tYXNzK2UueCplLm9wdGlvbnMubWFzcyx0LmNlbnRlck9mTWFzcy54Kj1vLHQuY2VudGVyT2ZNYXNzLnk9dC5jZW50ZXJPZk1hc3MueSp0Lm1hc3MrZS55KmUub3B0aW9ucy5tYXNzLHQuY2VudGVyT2ZNYXNzLnkqPW8sdC5tYXNzPWk7dmFyIG49TWF0aC5tYXgoTWF0aC5tYXgoZS5oZWlnaHQsZS5yYWRpdXMpLGUud2lkdGgpO3QubWF4V2lkdGg9dC5tYXhXaWR0aDxuP246dC5tYXhXaWR0aH19LHtrZXk6Il9wbGFjZUluVHJlZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpezE9PWkmJnZvaWQgMCE9PWl8fHRoaXMuX3VwZGF0ZUJyYW5jaE1hc3ModCxlKSx0LmNoaWxkcmVuLk5XLnJhbmdlLm1heFg+ZS54P3QuY2hpbGRyZW4uTlcucmFuZ2UubWF4WT5lLnk/dGhpcy5fcGxhY2VJblJlZ2lvbih0LGUsIk5XIik6dGhpcy5fcGxhY2VJblJlZ2lvbih0LGUsIlNXIik6dC5jaGlsZHJlbi5OVy5yYW5nZS5tYXhZPmUueT90aGlzLl9wbGFjZUluUmVnaW9uKHQsZSwiTkUiKTp0aGlzLl9wbGFjZUluUmVnaW9uKHQsZSwiU0UiKX19LHtrZXk6Il9wbGFjZUluUmVnaW9uIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7c3dpdGNoKHQuY2hpbGRyZW5baV0uY2hpbGRyZW5Db3VudCl7Y2FzZSAwOnQuY2hpbGRyZW5baV0uY2hpbGRyZW4uZGF0YT1lLHQuY2hpbGRyZW5baV0uY2hpbGRyZW5Db3VudD0xLHRoaXMuX3VwZGF0ZUJyYW5jaE1hc3ModC5jaGlsZHJlbltpXSxlKTticmVhaztjYXNlIDE6dC5jaGlsZHJlbltpXS5jaGlsZHJlbi5kYXRhLng9PT1lLngmJnQuY2hpbGRyZW5baV0uY2hpbGRyZW4uZGF0YS55PT09ZS55PyhlLngrPXRoaXMuc2VlZGVkUmFuZG9tKCksZS55Kz10aGlzLnNlZWRlZFJhbmRvbSgpKToodGhpcy5fc3BsaXRCcmFuY2godC5jaGlsZHJlbltpXSksdGhpcy5fcGxhY2VJblRyZWUodC5jaGlsZHJlbltpXSxlKSk7YnJlYWs7Y2FzZSA0OnRoaXMuX3BsYWNlSW5UcmVlKHQuY2hpbGRyZW5baV0sZSl9fX0se2tleToiX3NwbGl0QnJhbmNoIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1udWxsOzE9PT10LmNoaWxkcmVuQ291bnQmJihlPXQuY2hpbGRyZW4uZGF0YSx0Lm1hc3M9MCx0LmNlbnRlck9mTWFzcy54PTAsdC5jZW50ZXJPZk1hc3MueT0wKSx0LmNoaWxkcmVuQ291bnQ9NCx0LmNoaWxkcmVuLmRhdGE9bnVsbCx0aGlzLl9pbnNlcnRSZWdpb24odCwiTlciKSx0aGlzLl9pbnNlcnRSZWdpb24odCwiTkUiKSx0aGlzLl9pbnNlcnRSZWdpb24odCwiU1ciKSx0aGlzLl9pbnNlcnRSZWdpb24odCwiU0UiKSxudWxsIT1lJiZ0aGlzLl9wbGFjZUluVHJlZSh0LGUpfX0se2tleToiX2luc2VydFJlZ2lvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT12b2lkIDAsbz12b2lkIDAsbj12b2lkIDAscz12b2lkIDAscj0uNSp0LnNpemU7c3dpdGNoKGUpe2Nhc2UiTlciOmk9dC5yYW5nZS5taW5YLG89dC5yYW5nZS5taW5YK3Isbj10LnJhbmdlLm1pblkscz10LnJhbmdlLm1pblkrcjticmVhaztjYXNlIk5FIjppPXQucmFuZ2UubWluWCtyLG89dC5yYW5nZS5tYXhYLG49dC5yYW5nZS5taW5ZLHM9dC5yYW5nZS5taW5ZK3I7YnJlYWs7Y2FzZSJTVyI6aT10LnJhbmdlLm1pblgsbz10LnJhbmdlLm1pblgrcixuPXQucmFuZ2UubWluWStyLHM9dC5yYW5nZS5tYXhZO2JyZWFrO2Nhc2UiU0UiOmk9dC5yYW5nZS5taW5YK3Isbz10LnJhbmdlLm1heFgsbj10LnJhbmdlLm1pblkrcixzPXQucmFuZ2UubWF4WX10LmNoaWxkcmVuW2VdPXtjZW50ZXJPZk1hc3M6e3g6MCx5OjB9LG1hc3M6MCxyYW5nZTp7bWluWDppLG1heFg6byxtaW5ZOm4sbWF4WTpzfSxzaXplOi41KnQuc2l6ZSxjYWxjU2l6ZToyKnQuY2FsY1NpemUsY2hpbGRyZW46e2RhdGE6bnVsbH0sbWF4V2lkdGg6MCxsZXZlbDp0LmxldmVsKzEsY2hpbGRyZW5Db3VudDowfX19LHtrZXk6Il9kZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2b2lkIDAhPT10aGlzLmJhcm5lc0h1dFRyZWUmJih0LmxpbmVXaWR0aD0xLHRoaXMuX2RyYXdCcmFuY2godGhpcy5iYXJuZXNIdXRUcmVlLnJvb3QsdCxlKSl9fSx7a2V5OiJfZHJhd0JyYW5jaCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZvaWQgMD09PWkmJihpPSIjRkYwMDAwIiksND09PXQuY2hpbGRyZW5Db3VudCYmKHRoaXMuX2RyYXdCcmFuY2godC5jaGlsZHJlbi5OVyxlKSx0aGlzLl9kcmF3QnJhbmNoKHQuY2hpbGRyZW4uTkUsZSksdGhpcy5fZHJhd0JyYW5jaCh0LmNoaWxkcmVuLlNFLGUpLHRoaXMuX2RyYXdCcmFuY2godC5jaGlsZHJlbi5TVyxlKSksZS5zdHJva2VTdHlsZT1pLGUuYmVnaW5QYXRoKCksZS5tb3ZlVG8odC5yYW5nZS5taW5YLHQucmFuZ2UubWluWSksZS5saW5lVG8odC5yYW5nZS5tYXhYLHQucmFuZ2UubWluWSksZS5zdHJva2UoKSxlLmJlZ2luUGF0aCgpLGUubW92ZVRvKHQucmFuZ2UubWF4WCx0LnJhbmdlLm1pblkpLGUubGluZVRvKHQucmFuZ2UubWF4WCx0LnJhbmdlLm1heFkpLGUuc3Ryb2tlKCksZS5iZWdpblBhdGgoKSxlLm1vdmVUbyh0LnJhbmdlLm1heFgsdC5yYW5nZS5tYXhZKSxlLmxpbmVUbyh0LnJhbmdlLm1pblgsdC5yYW5nZS5tYXhZKSxlLnN0cm9rZSgpLGUuYmVnaW5QYXRoKCksZS5tb3ZlVG8odC5yYW5nZS5taW5YLHQucmFuZ2UubWF4WSksZS5saW5lVG8odC5yYW5nZS5taW5YLHQucmFuZ2UubWluWSksZS5zdHJva2UoKX19XSksdH0oKTtlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDEzNCkscz1vKG4pLHI9aSgxMzUpLGE9byhyKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGh5c2ljc0JvZHk9aSx0aGlzLnNldE9wdGlvbnMobyl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dH19LHtrZXk6InNvbHZlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlLGksbyxuLHMscixhLGg9dGhpcy5ib2R5Lm5vZGVzLGQ9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXMsbD10aGlzLnBoeXNpY3NCb2R5LmZvcmNlcyx1PXRoaXMub3B0aW9ucy5ub2RlRGlzdGFuY2UsYz0tMi8zL3UscD0wO3A8ZC5sZW5ndGgtMTtwKyspe3I9aFtkW3BdXTtmb3IodmFyIGY9cCsxO2Y8ZC5sZW5ndGg7ZisrKWE9aFtkW2ZdXSx0PWEueC1yLngsZT1hLnktci55LGk9TWF0aC5zcXJ0KHQqdCtlKmUpLDA9PT1pJiYoaT0uMSpNYXRoLnJhbmRvbSgpLHQ9aSksaTwyKnUmJihzPWk8LjUqdT8xOmMqaSs0LzMscy89aSxvPXQqcyxuPWUqcyxsW3IuaWRdLngtPW8sbFtyLmlkXS55LT1uLGxbYS5pZF0ueCs9byxsW2EuaWRdLnkrPW4pfX19XSksdH0oKTtlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDEzNCkscz1vKG4pLHI9aSgxMzUpLGE9byhyKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGh5c2ljc0JvZHk9aSx0aGlzLnNldE9wdGlvbnMobyl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dH19LHtrZXk6InNvbHZlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0LGUsaSxvLG4scyxyLGEsaCxkLGw9dGhpcy5ib2R5Lm5vZGVzLHU9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXMsYz10aGlzLnBoeXNpY3NCb2R5LmZvcmNlcyxwPXRoaXMub3B0aW9ucy5ub2RlRGlzdGFuY2U7Zm9yKGg9MDtoPHUubGVuZ3RoLTE7aCsrKWZvcihyPWxbdVtoXV0sZD1oKzE7ZDx1Lmxlbmd0aDtkKyspaWYoYT1sW3VbZF1dLHIubGV2ZWw9PT1hLmxldmVsKXt0PWEueC1yLngsZT1hLnktci55LGk9TWF0aC5zcXJ0KHQqdCtlKmUpO3M9aTxwPy1NYXRoLnBvdyguMDUqaSwyKStNYXRoLnBvdyguMDUqcCwyKTowLDA9PT1pP2k9LjAxOnMvPWksbz10KnMsbj1lKnMsY1tyLmlkXS54LT1vLGNbci5pZF0ueS09bixjW2EuaWRdLngrPW8sY1thLmlkXS55Kz1ufX19XSksdH0oKTtlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDEzNCkscz1vKG4pLHI9aSgxMzUpLGE9byhyKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGh5c2ljc0JvZHk9aSx0aGlzLnNldE9wdGlvbnMobyl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dH19LHtrZXk6InNvbHZlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD12b2lkIDAsZT12b2lkIDAsaT10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NFZGdlSW5kaWNlcyxvPXRoaXMuYm9keS5lZGdlcyxuPXZvaWQgMCxzPXZvaWQgMCxyPXZvaWQgMCxhPTA7YTxpLmxlbmd0aDthKyspZT1vW2lbYV1dLAohMD09PWUuY29ubmVjdGVkJiZlLnRvSWQhPT1lLmZyb21JZCYmdm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW2UudG9JZF0mJnZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1tlLmZyb21JZF0mJih2b2lkIDAhPT1lLmVkZ2VUeXBlLnZpYT8odD12b2lkIDA9PT1lLm9wdGlvbnMubGVuZ3RoP3RoaXMub3B0aW9ucy5zcHJpbmdMZW5ndGg6ZS5vcHRpb25zLmxlbmd0aCxuPWUudG8scz1lLmVkZ2VUeXBlLnZpYSxyPWUuZnJvbSx0aGlzLl9jYWxjdWxhdGVTcHJpbmdGb3JjZShuLHMsLjUqdCksdGhpcy5fY2FsY3VsYXRlU3ByaW5nRm9yY2UocyxyLC41KnQpKToodD12b2lkIDA9PT1lLm9wdGlvbnMubGVuZ3RoPzEuNSp0aGlzLm9wdGlvbnMuc3ByaW5nTGVuZ3RoOmUub3B0aW9ucy5sZW5ndGgsdGhpcy5fY2FsY3VsYXRlU3ByaW5nRm9yY2UoZS5mcm9tLGUudG8sdCkpKX19LHtrZXk6Il9jYWxjdWxhdGVTcHJpbmdGb3JjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXQueC1lLngsbj10LnktZS55LHM9TWF0aC5tYXgoTWF0aC5zcXJ0KG8qbytuKm4pLC4wMSkscj10aGlzLm9wdGlvbnMuc3ByaW5nQ29uc3RhbnQqKGktcykvcyxhPW8qcixoPW4qcjt2b2lkIDAhPT10aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1t0LmlkXSYmKHRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW3QuaWRdLngrPWEsdGhpcy5waHlzaWNzQm9keS5mb3JjZXNbdC5pZF0ueSs9aCksdm9pZCAwIT09dGhpcy5waHlzaWNzQm9keS5mb3JjZXNbZS5pZF0mJih0aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1tlLmlkXS54LT1hLHRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW2UuaWRdLnktPWgpfX1dKSx0fSgpO2UuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTM0KSxzPW8obikscj1pKDEzNSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5waHlzaWNzQm9keT1pLHRoaXMuc2V0T3B0aW9ucyhvKX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fX0se2tleToic29sdmUiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0LGUsaSxvLG4scyxyLGEsaD10aGlzLmJvZHkuZWRnZXMsZD10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NFZGdlSW5kaWNlcyxsPXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLHU9dGhpcy5waHlzaWNzQm9keS5mb3JjZXMsYz0wO2M8bC5sZW5ndGg7YysrKXt2YXIgcD1sW2NdO3VbcF0uc3ByaW5nRng9MCx1W3BdLnNwcmluZ0Z5PTB9Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspZT1oW2RbZl1dLCEwPT09ZS5jb25uZWN0ZWQmJih0PXZvaWQgMD09PWUub3B0aW9ucy5sZW5ndGg/dGhpcy5vcHRpb25zLnNwcmluZ0xlbmd0aDplLm9wdGlvbnMubGVuZ3RoLGk9ZS5mcm9tLngtZS50by54LG89ZS5mcm9tLnktZS50by55LGE9TWF0aC5zcXJ0KGkqaStvKm8pLGE9MD09PWE/LjAxOmEscj10aGlzLm9wdGlvbnMuc3ByaW5nQ29uc3RhbnQqKHQtYSkvYSxuPWkqcixzPW8qcixlLnRvLmxldmVsIT1lLmZyb20ubGV2ZWw/KHZvaWQgMCE9PXVbZS50b0lkXSYmKHVbZS50b0lkXS5zcHJpbmdGeC09bix1W2UudG9JZF0uc3ByaW5nRnktPXMpLHZvaWQgMCE9PXVbZS5mcm9tSWRdJiYodVtlLmZyb21JZF0uc3ByaW5nRngrPW4sdVtlLmZyb21JZF0uc3ByaW5nRnkrPXMpKToodm9pZCAwIT09dVtlLnRvSWRdJiYodVtlLnRvSWRdLngtPS41Km4sdVtlLnRvSWRdLnktPS41KnMpLHZvaWQgMCE9PXVbZS5mcm9tSWRdJiYodVtlLmZyb21JZF0ueCs9LjUqbix1W2UuZnJvbUlkXS55Kz0uNSpzKSkpO2Zvcih2YXIgbSx2LHI9MSxnPTA7ZzxsLmxlbmd0aDtnKyspe3ZhciB5PWxbZ107bT1NYXRoLm1pbihyLE1hdGgubWF4KC1yLHVbeV0uc3ByaW5nRngpKSx2PU1hdGgubWluKHIsTWF0aC5tYXgoLXIsdVt5XS5zcHJpbmdGeSkpLHVbeV0ueCs9bSx1W3ldLnkrPXZ9Zm9yKHZhciBiPTAsXz0wLHc9MDt3PGwubGVuZ3RoO3crKyl7dmFyIHg9bFt3XTtiKz11W3hdLngsXys9dVt4XS55fWZvcih2YXIgaz1iL2wubGVuZ3RoLE09Xy9sLmxlbmd0aCxTPTA7UzxsLmxlbmd0aDtTKyspe3ZhciBEPWxbU107dVtEXS54LT1rLHVbRF0ueS09TX19fV0pLHR9KCk7ZS5kZWZhdWx0PWh9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxMzQpLHM9byhuKSxyPWkoMTM1KSxhPW8ociksaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8peygwLHMuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLnBoeXNpY3NCb2R5PWksdGhpcy5zZXRPcHRpb25zKG8pfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zPXR9fSx7a2V5OiJzb2x2ZSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dm9pZCAwLGU9dm9pZCAwLGk9dm9pZCAwLG89dm9pZCAwLG49dGhpcy5ib2R5Lm5vZGVzLHM9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXMscj10aGlzLnBoeXNpY3NCb2R5LmZvcmNlcyxhPTA7YTxzLmxlbmd0aDthKyspe289bltzW2FdXSx0PS1vLngsZT0tby55LGk9TWF0aC5zcXJ0KHQqdCtlKmUpLHRoaXMuX2NhbGN1bGF0ZUZvcmNlcyhpLHQsZSxyLG8pfX19LHtrZXk6Il9jYWxjdWxhdGVGb3JjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7dmFyIHM9MD09PXQ/MDp0aGlzLm9wdGlvbnMuY2VudHJhbEdyYXZpdHkvdDtvW24uaWRdLng9ZSpzLG9bbi5pZF0ueT1pKnN9fV0pLHR9KCk7ZS5kZWZhdWx0PWh9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzUpLHM9byhuKSxyPWkoMTM0KSxhPW8ociksaD1pKDEzNSksZD1vKGgpLGw9aSgxNzgpLHU9byhsKSxjPWkoMTc5KSxwPW8oYyksZj1pKDIxMCksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6Il9jYWxjdWxhdGVGb3JjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7MD09PXQmJih0PS4xKk1hdGgucmFuZG9tKCksZT10KSx0aGlzLm92ZXJsYXBBdm9pZGFuY2VGYWN0b3I8MSYmby5zaGFwZS5yYWRpdXMmJih0PU1hdGgubWF4KC4xK3RoaXMub3ZlcmxhcEF2b2lkYW5jZUZhY3RvcipvLnNoYXBlLnJhZGl1cyx0LW8uc2hhcGUucmFkaXVzKSk7dmFyIHM9by5lZGdlcy5sZW5ndGgrMSxyPXRoaXMub3B0aW9ucy5ncmF2aXRhdGlvbmFsQ29uc3RhbnQqbi5tYXNzKm8ub3B0aW9ucy5tYXNzKnMvTWF0aC5wb3codCwyKSxhPWUqcixoPWkqcjt0aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1tvLmlkXS54Kz1hLHRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW28uaWRdLnkrPWh9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxNzUpLHM9byhuKSxyPWkoMTM0KSxhPW8ociksaD1pKDEzNSksZD1vKGgpLGw9aSgxNzgpLHU9byhsKSxjPWkoMTc5KSxwPW8oYyksZj1pKDIxNSksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6Il9jYWxjdWxhdGVGb3JjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7aWYodD4wKXt2YXIgcz1uLmVkZ2VzLmxlbmd0aCsxLHI9dGhpcy5vcHRpb25zLmNlbnRyYWxHcmF2aXR5KnMqbi5vcHRpb25zLm1hc3M7b1tuLmlkXS54PWUqcixvW24uaWRdLnk9aSpyfX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDU4KSxzPW8obikscj1pKDYyKSxhPW8ociksaD1pKDEzNCksZD1vKGgpLGw9aSgxMzUpLHU9byhsKSxjPWkoMSkscD1pKDIxOSkuZGVmYXVsdCxmPWkoMjIwKS5kZWZhdWx0LG09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBpPXRoaXM7KDAsZC5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2x1c3RlcmVkTm9kZXM9e30sdGhpcy5jbHVzdGVyZWRFZGdlcz17fSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17fSxjLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5ib2R5LmVtaXR0ZXIub24oIl9yZXNldERhdGEiLGZ1bmN0aW9uKCl7aS5jbHVzdGVyZWROb2Rlcz17fSxpLmNsdXN0ZXJlZEVkZ2VzPXt9fSl9cmV0dXJuKDAsdS5kZWZhdWx0KSh0LFt7a2V5OiJjbHVzdGVyQnlIdWJzaXplIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZvaWQgMD09PXQ/dD10aGlzLl9nZXRIdWJTaXplKCk6Im9iamVjdCI9PT0odm9pZCAwPT09dD8idW5kZWZpbmVkIjooMCxhLmRlZmF1bHQpKHQpKSYmKGU9dGhpcy5fY2hlY2tPcHRpb25zKHQpLHQ9dGhpcy5fZ2V0SHViU2l6ZSgpKTtmb3IodmFyIGk9W10sbz0wO288dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMuYm9keS5ub2Rlc1t0aGlzLmJvZHkubm9kZUluZGljZXNbb11dO24uZWRnZXMubGVuZ3RoPj10JiZpLnB1c2gobi5pZCl9Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspdGhpcy5jbHVzdGVyQnlDb25uZWN0aW9uKGlbc10sZSwhMCk7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIil9fSx7a2V5OiJjbHVzdGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07aWYodm9pZCAwPT09dC5qb2luQ29uZGl0aW9uKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNhbGwgY2x1c3RlckJ5Tm9kZURhdGEgd2l0aG91dCBhIGpvaW5Db25kaXRpb24gZnVuY3Rpb24gaW4gdGhlIG9wdGlvbnMuIik7dD10aGlzLl9jaGVja09wdGlvbnModCk7Zm9yKHZhciBpPXt9LG89e30sbj0wO248dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtuKyspe3ZhciBzPXRoaXMuYm9keS5ub2RlSW5kaWNlc1tuXSxyPXRoaXMuYm9keS5ub2Rlc1tzXSxhPXAuY2xvbmVPcHRpb25zKHIpO2lmKCEwPT09dC5qb2luQ29uZGl0aW9uKGEpKXtpW3NdPXRoaXMuYm9keS5ub2Rlc1tzXTtmb3IodmFyIGg9MDtoPHIuZWRnZXMubGVuZ3RoO2grKyl7dmFyIGQ9ci5lZGdlc1toXTt2b2lkIDA9PT10aGlzLmNsdXN0ZXJlZEVkZ2VzW2QuaWRdJiYob1tkLmlkXT1kKX19fXRoaXMuX2NsdXN0ZXIoaSxvLHQsZSl9fSx7a2V5OiJjbHVzdGVyQnlFZGdlQ291bnQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9IShhcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSl8fGFyZ3VtZW50c1syXTtlPXRoaXMuX2NoZWNrT3B0aW9ucyhlKTtmb3IodmFyIG89W10sbj17fSxyPXZvaWQgMCxhPXZvaWQgMCxoPXZvaWQgMCxkPXZvaWQgMCxsPXZvaWQgMCx1PTA7dTx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO3UrKyl7dmFyIGM9e30sZj17fTtpZihkPXRoaXMuYm9keS5ub2RlSW5kaWNlc1t1XSx2b2lkIDA9PT1uW2RdKXtsPTAsaD10aGlzLmJvZHkubm9kZXNbZF0sYT1bXTtmb3IodmFyIG09MDttPGguZWRnZXMubGVuZ3RoO20rKylyPWguZWRnZXNbbV0sdm9pZCAwPT09dGhpcy5jbHVzdGVyZWRFZGdlc1tyLmlkXSYmKHIudG9JZCE9PXIuZnJvbUlkJiZsKyssYS5wdXNoKHIpKTtpZihsPT09dCl7Zm9yKHZhciB2PSEwLGc9MDtnPGEubGVuZ3RoO2crKyl7cj1hW2ddO3ZhciB5PXRoaXMuX2dldENvbm5lY3RlZElkKHIsZCk7aWYodm9pZCAwPT09ZS5qb2luQ29uZGl0aW9uKWZbci5pZF09cixjW2RdPXRoaXMuYm9keS5ub2Rlc1tkXSxjW3ldPXRoaXMuYm9keS5ub2Rlc1t5XSxuW2RdPSEwO2Vsc2V7dmFyIGI9cC5jbG9uZU9wdGlvbnModGhpcy5ib2R5Lm5vZGVzW2RdKTtpZighMCE9PWUuam9pbkNvbmRpdGlvbihiKSl7dj0hMTticmVha31mW3IuaWRdPXIsY1tkXT10aGlzLmJvZHkubm9kZXNbZF0sbltkXT0hMH19KDAscy5kZWZhdWx0KShjKS5sZW5ndGg+MCYmKDAscy5kZWZhdWx0KShmKS5sZW5ndGg+MCYmITA9PT12JiZvLnB1c2goe25vZGVzOmMsZWRnZXM6Zn0pfX19Zm9yKHZhciBfPTA7XzxvLmxlbmd0aDtfKyspdGhpcy5fY2x1c3RlcihvW19dLm5vZGVzLG9bX10uZWRnZXMsZSwhMSk7ITA9PT1pJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfZGF0YUNoYW5nZWQiKX19LHtrZXk6ImNsdXN0ZXJPdXRsaWVycyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTt0aGlzLmNsdXN0ZXJCeUVkZ2VDb3VudCgxLHQsZSl9fSx7a2V5OiJjbHVzdGVyQnJpZGdlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTt0aGlzLmNsdXN0ZXJCeUVkZ2VDb3VudCgyLHQsZSl9fSx7a2V5OiJjbHVzdGVyQnlDb25uZWN0aW9uIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPSEoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0pfHxhcmd1bWVudHNbMl07aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoIk5vIG5vZGVJZCBzdXBwbGllZCB0byBjbHVzdGVyQnlDb25uZWN0aW9uISIpO2lmKHZvaWQgMD09PXRoaXMuYm9keS5ub2Rlc1t0XSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBub2RlSWQgZ2l2ZW4gdG8gY2x1c3RlckJ5Q29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdCEiKTt2YXIgbz10aGlzLmJvZHkubm9kZXNbdF07ZT10aGlzLl9jaGVja09wdGlvbnMoZSxvKSx2b2lkIDA9PT1lLmNsdXN0ZXJOb2RlUHJvcGVydGllcy54JiYoZS5jbHVzdGVyTm9kZVByb3BlcnRpZXMueD1vLngpLHZvaWQgMD09PWUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLnkmJihlLmNsdXN0ZXJOb2RlUHJvcGVydGllcy55PW8ueSksdm9pZCAwPT09ZS5jbHVzdGVyTm9kZVByb3BlcnRpZXMuZml4ZWQmJihlLmNsdXN0ZXJOb2RlUHJvcGVydGllcy5maXhlZD17fSxlLmNsdXN0ZXJOb2RlUHJvcGVydGllcy5maXhlZC54PW8ub3B0aW9ucy5maXhlZC54LGUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLmZpeGVkLnk9by5vcHRpb25zLmZpeGVkLnkpO3ZhciBuPXt9LHI9e30sYT1vLmlkLGg9cC5jbG9uZU9wdGlvbnMobyk7blthXT1vO2Zvcih2YXIgZD0wO2Q8by5lZGdlcy5sZW5ndGg7ZCsrKXt2YXIgbD1vLmVkZ2VzW2RdO2lmKHZvaWQgMD09PXRoaXMuY2x1c3RlcmVkRWRnZXNbbC5pZF0pe3ZhciB1PXRoaXMuX2dldENvbm5lY3RlZElkKGwsYSk7aWYodm9pZCAwPT09dGhpcy5jbHVzdGVyZWROb2Rlc1t1XSlpZih1IT09YSlpZih2b2lkIDA9PT1lLmpvaW5Db25kaXRpb24pcltsLmlkXT1sLG5bdV09dGhpcy5ib2R5Lm5vZGVzW3VdO2Vsc2V7dmFyIGM9cC5jbG9uZU9wdGlvbnModGhpcy5ib2R5Lm5vZGVzW3VdKTshMD09PWUuam9pbkNvbmRpdGlvbihoLGMpJiYocltsLmlkXT1sLG5bdV09dGhpcy5ib2R5Lm5vZGVzW3VdKX1lbHNlIHJbbC5pZF09bH19dmFyIGY9KDAscy5kZWZhdWx0KShuKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG5bdF0uaWR9KTtmb3IobSBpbiBuKWZvcih2YXIgbT1uW21dLHY9MDt2PG0uZWRnZXMubGVuZ3RoO3YrKyl7dmFyIGc9bS5lZGdlc1t2XTtmLmluZGV4T2YodGhpcy5fZ2V0Q29ubmVjdGVkSWQoZyxtLmlkKSk+LTEmJihyW2cuaWRdPWcpfXRoaXMuX2NsdXN0ZXIobixyLGUsaSl9fSx7a2V5OiJfY3JlYXRlQ2x1c3RlckVkZ2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXtmb3IodmFyIG49dm9pZCAwLHI9dm9pZCAwLGE9dm9pZCAwLGg9dm9pZCAwLGQ9dm9pZCAwLGw9dm9pZCAwLHU9KDAscy5kZWZhdWx0KSh0KSxmPVtdLG09MDttPHUubGVuZ3RoO20rKyl7cj11W21dLGE9dFtyXTtmb3IodmFyIHY9MDt2PGEuZWRnZXMubGVuZ3RoO3YrKyluPWEuZWRnZXNbdl0sdm9pZCAwPT09dGhpcy5jbHVzdGVyZWRFZGdlc1tuLmlkXSYmKG4udG9JZD09bi5mcm9tSWQ/ZVtuLmlkXT1uOm4udG9JZD09cj8oaD1pLmlkLGQ9bi5mcm9tSWQsbD1kKTooaD1uLnRvSWQsZD1pLmlkLGw9aCksdm9pZCAwPT09dFtsXSYmZi5wdXNoKHtlZGdlOm4sZnJvbUlkOmQsdG9JZDpofSkpfWZvcih2YXIgZz0wO2c8Zi5sZW5ndGg7ZysrKXt2YXIgeT1mW2ddLmVkZ2UsYj1wLmNsb25lT3B0aW9ucyh5LCJlZGdlIik7Yy5kZWVwRXh0ZW5kKGIsbyksYi5mcm9tPWZbZ10uZnJvbUlkLGIudG89ZltnXS50b0lkLGIuaWQ9ImNsdXN0ZXJFZGdlOiIrYy5yYW5kb21VVUlEKCk7dmFyIF89dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVFZGdlKGIpO18uY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZD15LmlkLHRoaXMuYm9keS5lZGdlc1t5LmlkXS5lZGdlUmVwbGFjZWRCeUlkPV8uaWQsdGhpcy5ib2R5LmVkZ2VzW18uaWRdPV8sXy5jb25uZWN0KCksdGhpcy5fYmFja3VwRWRnZU9wdGlvbnMoeSkseS5zZXRPcHRpb25zKHtwaHlzaWNzOiExLGhpZGRlbjohMH0pfX19LHtrZXk6Il9jaGVja09wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3JldHVybiB2b2lkIDA9PT10LmNsdXN0ZXJFZGdlUHJvcGVydGllcyYmKHQuY2x1c3RlckVkZ2VQcm9wZXJ0aWVzPXt9KSx2b2lkIDA9PT10LmNsdXN0ZXJOb2RlUHJvcGVydGllcyYmKHQuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzPXt9KSx0fX0se2tleToiX2NsdXN0ZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz0hKGFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdKXx8YXJndW1lbnRzWzNdO2lmKDAhPSgwLHMuZGVmYXVsdCkodCkubGVuZ3RoJiYoMSE9KDAscy5kZWZhdWx0KSh0KS5sZW5ndGh8fDE9PWkuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLmFsbG93U2luZ2xlTm9kZUNsdXN0ZXIpKXtmb3IodmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pJiZ2b2lkIDAhPT10aGlzLmNsdXN0ZXJlZE5vZGVzW25dKXJldHVybjt2YXIgcj1jLmRlZXBFeHRlbmQoe30saS5jbHVzdGVyTm9kZVByb3BlcnRpZXMpO2lmKHZvaWQgMCE9PWkucHJvY2Vzc1Byb3BlcnRpZXMpe3ZhciBhPVtdO2Zvcih2YXIgaCBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaCkpe3ZhciBkPXAuY2xvbmVPcHRpb25zKHRbaF0pO2EucHVzaChkKX12YXIgbD1bXTtmb3IodmFyIHUgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHUpJiYiY2x1c3RlckVkZ2U6IiE9PXUuc3Vic3RyKDAsMTIpKXt2YXIgbT1wLmNsb25lT3B0aW9ucyhlW3VdLCJlZGdlIik7bC5wdXNoKG0pfWlmKCEocj1pLnByb2Nlc3NQcm9wZXJ0aWVzKHIsYSxsKSkpdGhyb3cgbmV3IEVycm9yKCJUaGUgcHJvY2Vzc1Byb3BlcnRpZXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIHByb3BlcnRpZXMhIil9dm9pZCAwPT09ci5pZCYmKHIuaWQ9ImNsdXN0ZXI6IitjLnJhbmRvbVVVSUQoKSk7dmFyIHY9ci5pZDt2b2lkIDA9PT1yLmxhYmVsJiYoci5sYWJlbD0iY2x1c3RlciIpO3ZhciBnPXZvaWQgMDt2b2lkIDA9PT1yLngmJihnPXRoaXMuX2dldENsdXN0ZXJQb3NpdGlvbih0KSxyLng9Zy54KSx2b2lkIDA9PT1yLnkmJih2b2lkIDA9PT1nJiYoZz10aGlzLl9nZXRDbHVzdGVyUG9zaXRpb24odCkpLHIueT1nLnkpLHIuaWQ9djt2YXIgeT10aGlzLmJvZHkuZnVuY3Rpb25zLmNyZWF0ZU5vZGUocixmKTt5LmlzQ2x1c3Rlcj0hMCx5LmNvbnRhaW5lZE5vZGVzPXQseS5jb250YWluZWRFZGdlcz1lLHkuY2x1c3RlckVkZ2VQcm9wZXJ0aWVzPWkuY2x1c3RlckVkZ2VQcm9wZXJ0aWVzLHRoaXMuYm9keS5ub2Rlc1tyLmlkXT15LHRoaXMuX2NyZWF0ZUNsdXN0ZXJFZGdlcyh0LGUscixpLmNsdXN0ZXJFZGdlUHJvcGVydGllcyk7Zm9yKHZhciBiIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShiKSYmdm9pZCAwIT09dGhpcy5ib2R5LmVkZ2VzW2JdKXt2YXIgXz10aGlzLmJvZHkuZWRnZXNbYl07dGhpcy5fYmFja3VwRWRnZU9wdGlvbnMoXyksXy5zZXRPcHRpb25zKHtwaHlzaWNzOiExLGhpZGRlbjohMH0pfWZvcih2YXIgdyBpbiB0KXQuaGFzT3duUHJvcGVydHkodykmJih0aGlzLmNsdXN0ZXJlZE5vZGVzW3ddPXtjbHVzdGVySWQ6ci5pZCxub2RlOnRoaXMuYm9keS5ub2Rlc1t3XX0sdGhpcy5ib2R5Lm5vZGVzW3ddLnNldE9wdGlvbnMoe2hpZGRlbjohMCxwaHlzaWNzOiExfSkpO3IuaWQ9dm9pZCAwLCEwPT09byYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIil9fX0se2tleToiX2JhY2t1cEVkZ2VPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2b2lkIDA9PT10aGlzLmNsdXN0ZXJlZEVkZ2VzW3QuaWRdJiYodGhpcy5jbHVzdGVyZWRFZGdlc1t0LmlkXT17cGh5c2ljczp0Lm9wdGlvbnMucGh5c2ljcyxoaWRkZW46dC5vcHRpb25zLmhpZGRlbn0pfX0se2tleToiX3Jlc3RvcmVFZGdlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNsdXN0ZXJlZEVkZ2VzW3QuaWRdO3ZvaWQgMCE9PWUmJih0LnNldE9wdGlvbnMoe3BoeXNpY3M6ZS5waHlzaWNzLGhpZGRlbjplLmhpZGRlbn0pLGRlbGV0ZSB0aGlzLmNsdXN0ZXJlZEVkZ2VzW3QuaWRdKX19LHtrZXk6ImlzQ2x1c3RlciIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0XT8hMD09PXRoaXMuYm9keS5ub2Rlc1t0XS5pc0NsdXN0ZXI6KGNvbnNvbGUubG9nKCJOb2RlIGRvZXMgbm90IGV4aXN0LiIpLCExKX19LHtrZXk6Il9nZXRDbHVzdGVyUG9zaXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0oMCxzLmRlZmF1bHQpKHQpLGk9dFtlWzBdXS54LG89dFtlWzBdXS54LG49dFtlWzBdXS55LHI9dFtlWzBdXS55LGE9dm9pZCAwLGg9MTtoPGUubGVuZ3RoO2grKylhPXRbZVtoXV0saT1hLng8aT9hLng6aSxvPWEueD5vP2EueDpvLG49YS55PG4/YS55Om4scj1hLnk+cj9hLnk6cjtyZXR1cm57eDouNSooaStvKSx5Oi41KihuK3IpfX19LHtrZXk6Im9wZW5DbHVzdGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPSEoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0pfHxhcmd1bWVudHNbMl07aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoIk5vIGNsdXN0ZXJOb2RlSWQgc3VwcGxpZWQgdG8gb3BlbkNsdXN0ZXIuIik7aWYodm9pZCAwPT09dGhpcy5ib2R5Lm5vZGVzW3RdKXRocm93IG5ldyBFcnJvcigiVGhlIGNsdXN0ZXJOb2RlSWQgc3VwcGxpZWQgdG8gb3BlbkNsdXN0ZXIgZG9lcyBub3QgZXhpc3QuIik7aWYodm9pZCAwPT09dGhpcy5ib2R5Lm5vZGVzW3RdLmNvbnRhaW5lZE5vZGVzKXJldHVybiB2b2lkIGNvbnNvbGUubG9nKCJUaGUgbm9kZToiK3QrIiBpcyBub3QgYSBjbHVzdGVyLiIpO3ZhciBvPXRoaXMuYm9keS5ub2Rlc1t0XSxuPW8uY29udGFpbmVkTm9kZXMscz1vLmNvbnRhaW5lZEVkZ2VzO2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWUucmVsZWFzZUZ1bmN0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5yZWxlYXNlRnVuY3Rpb24pe3ZhciByPXt9LGE9e3g6by54LHk6by55fTtmb3IodmFyIGggaW4gbilpZihuLmhhc093blByb3BlcnR5KGgpKXt2YXIgZD10aGlzLmJvZHkubm9kZXNbaF07cltoXT17eDpkLngseTpkLnl9fXZhciBsPWUucmVsZWFzZUZ1bmN0aW9uKGEscik7Zm9yKHZhciB1IGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eSh1KSl7dmFyIGY9dGhpcy5ib2R5Lm5vZGVzW3VdO3ZvaWQgMCE9PWxbdV0mJihmLng9dm9pZCAwPT09bFt1XS54P28ueDpsW3VdLngsZi55PXZvaWQgMD09PWxbdV0ueT9vLnk6bFt1XS55KX19ZWxzZSBmb3IodmFyIG0gaW4gbilpZihuLmhhc093blByb3BlcnR5KG0pKXt2YXIgdj10aGlzLmJvZHkubm9kZXNbbV07dj1uW21dLCExPT09di5vcHRpb25zLmZpeGVkLngmJih2Lng9by54KSwhMT09PXYub3B0aW9ucy5maXhlZC55JiYodi55PW8ueSl9Zm9yKHZhciBnIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShnKSl7dmFyIHk9dGhpcy5ib2R5Lm5vZGVzW2ddO3kudng9by52eCx5LnZ5PW8udnkseS5zZXRPcHRpb25zKHtoaWRkZW46ITEscGh5c2ljczohMH0pLGRlbGV0ZSB0aGlzLmNsdXN0ZXJlZE5vZGVzW2ddfWZvcih2YXIgYj1bXSxfPTA7XzxvLmVkZ2VzLmxlbmd0aDtfKyspYi5wdXNoKG8uZWRnZXNbX10pO2Zvcih2YXIgdz0wO3c8Yi5sZW5ndGg7dysrKXt2YXIgeD1iW3ddLGs9dGhpcy5fZ2V0Q29ubmVjdGVkSWQoeCx0KTtpZih2b2lkIDAhPT10aGlzLmNsdXN0ZXJlZE5vZGVzW2tdKXt2YXIgTT10aGlzLmJvZHkubm9kZXNbdGhpcy5jbHVzdGVyZWROb2Rlc1trXS5jbHVzdGVySWRdLFM9dGhpcy5ib2R5LmVkZ2VzW3guY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZF07aWYodm9pZCAwIT09Uyl7TS5jb250YWluZWRFZGdlc1tTLmlkXT1TLGRlbGV0ZSBzW1MuaWRdO3ZhciBEPVMuZnJvbUlkLE89Uy50b0lkO1MudG9JZD09az9PPXRoaXMuY2x1c3RlcmVkTm9kZXNba10uY2x1c3RlcklkOkQ9dGhpcy5jbHVzdGVyZWROb2Rlc1trXS5jbHVzdGVySWQ7dmFyIEM9cC5jbG9uZU9wdGlvbnMoUywiZWRnZSIpO2MuZGVlcEV4dGVuZChDLE0uY2x1c3RlckVkZ2VQcm9wZXJ0aWVzKTt2YXIgVD0iY2x1c3RlckVkZ2U6IitjLnJhbmRvbVVVSUQoKTtjLmRlZXBFeHRlbmQoQyx7ZnJvbTpELHRvOk8saGlkZGVuOiExLHBoeXNpY3M6ITAsaWQ6VH0pO3ZhciBFPXRoaXMuYm9keS5mdW5jdGlvbnMuY3JlYXRlRWRnZShDKTtFLmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWQ9Uy5pZCx0aGlzLmJvZHkuZWRnZXNbVF09RSx0aGlzLmJvZHkuZWRnZXNbVF0uY29ubmVjdCgpfX1lbHNle3ZhciBQPXRoaXMuYm9keS5lZGdlc1t4LmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWRdO3ZvaWQgMCE9PVAmJnRoaXMuX3Jlc3RvcmVFZGdlKFApfXguY2xlYW51cCgpLHguZGlzY29ubmVjdCgpLGRlbGV0ZSB0aGlzLmJvZHkuZWRnZXNbeC5pZF19Zm9yKHZhciBJIGluIHMpcy5oYXNPd25Qcm9wZXJ0eShJKSYmdGhpcy5fcmVzdG9yZUVkZ2Uoc1tJXSk7ZGVsZXRlIHRoaXMuYm9keS5ub2Rlc1t0XSwhMD09PWkmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToiZ2V0Tm9kZXNJbkNsdXN0ZXIiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKCEwPT09dGhpcy5pc0NsdXN0ZXIodCkpe3ZhciBpPXRoaXMuYm9keS5ub2Rlc1t0XS5jb250YWluZWROb2Rlcztmb3IodmFyIG8gaW4gaSlpLmhhc093blByb3BlcnR5KG8pJiZlLnB1c2godGhpcy5ib2R5Lm5vZGVzW29dLmlkKX1yZXR1cm4gZX19LHtrZXk6ImZpbmROb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO3ZvaWQgMCE9PXRoaXMuY2x1c3RlcmVkTm9kZXNbdF0mJmk8MTAwOyllLnB1c2godGhpcy5ib2R5Lm5vZGVzW3RdLmlkKSx0PXRoaXMuY2x1c3RlcmVkTm9kZXNbdF0uY2x1c3RlcklkLGkrKztyZXR1cm4gZS5wdXNoKHRoaXMuYm9keS5ub2Rlc1t0XS5pZCksZS5yZXZlcnNlKCksZX19LHtrZXk6InVwZGF0ZUNsdXN0ZXJlZE5vZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoIk5vIGNsdXN0ZXJlZE5vZGVJZCBzdXBwbGllZCB0byB1cGRhdGVDbHVzdGVyZWROb2RlLiIpO2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKCJObyBuZXdPcHRpb25zIHN1cHBsaWVkIHRvIHVwZGF0ZUNsdXN0ZXJlZE5vZGUuIik7aWYodm9pZCAwPT09dGhpcy5ib2R5Lm5vZGVzW3RdKXRocm93IG5ldyBFcnJvcigiVGhlIGNsdXN0ZXJlZE5vZGVJZCBzdXBwbGllZCB0byB1cGRhdGVDbHVzdGVyZWROb2RlIGRvZXMgbm90IGV4aXN0LiIpO3RoaXMuYm9keS5ub2Rlc1t0XS5zZXRPcHRpb25zKGUpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToidXBkYXRlRWRnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcigiTm8gc3RhcnRFZGdlSWQgc3VwcGxpZWQgdG8gdXBkYXRlRWRnZS4iKTtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcigiTm8gbmV3T3B0aW9ucyBzdXBwbGllZCB0byB1cGRhdGVFZGdlLiIpO2lmKHZvaWQgMD09PXRoaXMuYm9keS5lZGdlc1t0XSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzdGFydEVkZ2VJZCBzdXBwbGllZCB0byB1cGRhdGVFZGdlIGRvZXMgbm90IGV4aXN0LiIpO2Zvcih2YXIgaT10aGlzLmdldENsdXN0ZXJlZEVkZ2VzKHQpLG89MDtvPGkubGVuZ3RoO28rKyl7dGhpcy5ib2R5LmVkZ2VzW2lbb11dLnNldE9wdGlvbnMoZSl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIil9fSx7a2V5OiJnZXRDbHVzdGVyZWRFZGdlcyIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9MDt2b2lkIDAhPT10JiZ2b2lkIDAhPT10aGlzLmJvZHkuZWRnZXNbdF0mJmk8MTAwOyllLnB1c2godGhpcy5ib2R5LmVkZ2VzW3RdLmlkKSx0PXRoaXMuYm9keS5lZGdlc1t0XS5lZGdlUmVwbGFjZWRCeUlkLGkrKztyZXR1cm4gZS5yZXZlcnNlKCksZX19LHtrZXk6ImdldEJhc2VFZGdlIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dCxpPTA7dm9pZCAwIT09dCYmdm9pZCAwIT09dGhpcy5ib2R5LmVkZ2VzW3RdJiZpPDEwMDspdD10aGlzLmJvZHkuZWRnZXNbdF0uY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZCxpKyssdm9pZCAwIT09dCYmKGU9dCk7cmV0dXJuIGV9fSx7a2V5OiJfZ2V0Q29ubmVjdGVkSWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9JZCE9ZT90LnRvSWQ6KHQuZnJvbUlkLHQuZnJvbUlkKX19LHtrZXk6Il9nZXRIdWJTaXplIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MCxpPTAsbz0wLG49MDtuPHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7bisrKXt2YXIgcz10aGlzLmJvZHkubm9kZXNbdGhpcy5ib2R5Lm5vZGVJbmRpY2VzW25dXTtzLmVkZ2VzLmxlbmd0aD5vJiYobz1zLmVkZ2VzLmxlbmd0aCksdCs9cy5lZGdlcy5sZW5ndGgsZSs9TWF0aC5wb3cocy5lZGdlcy5sZW5ndGgsMiksaSs9MX10Lz1pLGUvPWk7dmFyIHI9ZS1NYXRoLnBvdyh0LDIpLGE9TWF0aC5zcXJ0KHIpLGg9TWF0aC5mbG9vcih0KzIqYSk7cmV0dXJuIGg+byYmKGg9byksaH19XSksdH0oKTtlLmRlZmF1bHQ9bX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDEzNCkscz1vKG4pLHI9aSgxMzUpLGE9byhyKSxoPWkoMSksZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LG51bGwsW3trZXk6ImdldFJhbmdlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbXSxvPTFlOSxuPS0xZTkscz0xZTkscj0tMWU5O2lmKGkubGVuZ3RoPjApZm9yKHZhciBhPTA7YTxpLmxlbmd0aDthKyspZT10W2lbYV1dLHM+ZS5zaGFwZS5ib3VuZGluZ0JveC5sZWZ0JiYocz1lLnNoYXBlLmJvdW5kaW5nQm94LmxlZnQpLHI8ZS5zaGFwZS5ib3VuZGluZ0JveC5yaWdodCYmKHI9ZS5zaGFwZS5ib3VuZGluZ0JveC5yaWdodCksbz5lLnNoYXBlLmJvdW5kaW5nQm94LnRvcCYmKG89ZS5zaGFwZS5ib3VuZGluZ0JveC50b3ApLG48ZS5zaGFwZS5ib3VuZGluZ0JveC5ib3R0b20mJihuPWUuc2hhcGUuYm91bmRpbmdCb3guYm90dG9tKTtyZXR1cm4gMWU5PT09cyYmLTFlOT09PXImJjFlOT09PW8mJi0xZTk9PT1uJiYobz0wLG49MCxzPTAscj0wKSx7bWluWDpzLG1heFg6cixtaW5ZOm8sbWF4WTpufX19LHtrZXk6ImdldFJhbmdlQ29yZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsaT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06W10sbz0xZTksbj0tMWU5LHM9MWU5LHI9LTFlOTtpZihpLmxlbmd0aD4wKWZvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKWU9dFtpW2FdXSxzPmUueCYmKHM9ZS54KSxyPGUueCYmKHI9ZS54KSxvPmUueSYmKG89ZS55KSxuPGUueSYmKG49ZS55KTtyZXR1cm4gMWU5PT09cyYmLTFlOT09PXImJjFlOT09PW8mJi0xZTk9PT1uJiYobz0wLG49MCxzPTAscj0wKSx7bWluWDpzLG1heFg6cixtaW5ZOm8sbWF4WTpufX19LHtrZXk6ImZpbmRDZW50ZXIiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybnt4Oi41Kih0Lm1heFgrdC5taW5YKSx5Oi41Kih0Lm1heFkrdC5taW5ZKX19fSx7a2V5OiJjbG9uZU9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9e307cmV0dXJuIHZvaWQgMD09PWV8fCJub2RlIj09PWU/KGguZGVlcEV4dGVuZChpLHQub3B0aW9ucywhMCksaS54PXQueCxpLnk9dC55LGkuYW1vdW50T2ZDb25uZWN0aW9ucz10LmVkZ2VzLmxlbmd0aCk6aC5kZWVwRXh0ZW5kKGksdC5vcHRpb25zLCEwKSxpfX1dKSx0fSgpO2UuZGVmYXVsdD1kfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTc1KSxzPW8obikscj1pKDEzNCksYT1vKHIpLGg9aSgxNzgpLGQ9byhoKSxsPWkoMTc5KSx1PW8obCksYz1pKDE2OCkscD1vKGMpLGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyxuLHIpeygwLGEuZGVmYXVsdCkodGhpcyxlKTt2YXIgaD0oMCxkLmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8sbixyKSk7cmV0dXJuIGguaXNDbHVzdGVyPSEwLGguY29udGFpbmVkTm9kZXM9e30saC5jb250YWluZWRFZGdlcz17fSxofXJldHVybigwLHUuZGVmYXVsdCkoZSx0KSxlfShwLmRlZmF1bHQpO2UuZGVmYXVsdD1mfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTM0KSxzPW8obikscj1pKDEzNSksYT1vKHIpOyJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpO3ZhciBoPWkoMSksZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5jYW52YXM9aSx0aGlzLnJlZHJhd1JlcXVlc3RlZD0hMSx0aGlzLnJlbmRlclRpbWVyPXZvaWQgMCx0aGlzLnJlcXVpcmVzVGltZW91dD0hMCx0aGlzLnJlbmRlcmluZ0FjdGl2ZT0hMSx0aGlzLnJlbmRlclJlcXVlc3RzPTAsdGhpcy5waXhlbFJhdGlvPXZvaWQgMCx0aGlzLmFsbG93UmVkcmF3PSEwLHRoaXMuZHJhZ2dpbmc9ITEsdGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e2hpZGVFZGdlc09uRHJhZzohMSxoaWRlTm9kZXNPbkRyYWc6ITF9LGguZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLl9kZXRlcm1pbmVCcm93c2VyTWV0aG9kKCksdGhpcy5iaW5kRXZlbnRMaXN0ZW5lcnMoKX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6ImJpbmRFdmVudExpc3RlbmVycyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKCJkcmFnU3RhcnQiLGZ1bmN0aW9uKCl7dC5kcmFnZ2luZz0hMH0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJkcmFnRW5kIixmdW5jdGlvbigpe3QuZHJhZ2dpbmc9ITF9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX3Jlc2l6ZU5vZGVzIixmdW5jdGlvbigpe3QuX3Jlc2l6ZU5vZGVzKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX3JlZHJhdyIsZnVuY3Rpb24oKXshMT09PXQucmVuZGVyaW5nQWN0aXZlJiZ0Ll9yZWRyYXcoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJfYmxvY2tSZWRyYXciLGZ1bmN0aW9uKCl7dC5hbGxvd1JlZHJhdz0hMX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJfYWxsb3dSZWRyYXciLGZ1bmN0aW9uKCl7dC5hbGxvd1JlZHJhdz0hMCx0LnJlZHJhd1JlcXVlc3RlZD0hMX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJfcmVxdWVzdFJlZHJhdyIsdGhpcy5fcmVxdWVzdFJlZHJhdy5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX3N0YXJ0UmVuZGVyaW5nIixmdW5jdGlvbigpe3QucmVuZGVyUmVxdWVzdHMrPTEsdC5yZW5kZXJpbmdBY3RpdmU9ITAsdC5fc3RhcnRSZW5kZXJpbmcoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJfc3RvcFJlbmRlcmluZyIsZnVuY3Rpb24oKXt0LnJlbmRlclJlcXVlc3RzLT0xLHQucmVuZGVyaW5nQWN0aXZlPXQucmVuZGVyUmVxdWVzdHM+MCx0LnJlbmRlclRpbWVyPXZvaWQgMH0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJkZXN0cm95IixmdW5jdGlvbigpe3QucmVuZGVyUmVxdWVzdHM9MCx0LmFsbG93UmVkcmF3PSExLHQucmVuZGVyaW5nQWN0aXZlPSExLCEwPT09dC5yZXF1aXJlc1RpbWVvdXQ/Y2xlYXJUaW1lb3V0KHQucmVuZGVyVGltZXIpOmNhbmNlbEFuaW1hdGlvbkZyYW1lKHQucmVuZGVyVGltZXIpLHQuYm9keS5lbWl0dGVyLm9mZigpfSl9fSx7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10KXt2YXIgZT1bImhpZGVFZGdlc09uRHJhZyIsImhpZGVOb2Rlc09uRHJhZyJdO2guc2VsZWN0aXZlRGVlcEV4dGVuZChlLHRoaXMub3B0aW9ucyx0KX19fSx7a2V5OiJfc3RhcnRSZW5kZXJpbmciLHZhbHVlOmZ1bmN0aW9uKCl7ITA9PT10aGlzLnJlbmRlcmluZ0FjdGl2ZSYmdm9pZCAwPT09dGhpcy5yZW5kZXJUaW1lciYmKCEwPT09dGhpcy5yZXF1aXJlc1RpbWVvdXQ/dGhpcy5yZW5kZXJUaW1lcj13aW5kb3cuc2V0VGltZW91dCh0aGlzLl9yZW5kZXJTdGVwLmJpbmQodGhpcyksdGhpcy5zaW11bGF0aW9uSW50ZXJ2YWwpOnRoaXMucmVuZGVyVGltZXI9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9yZW5kZXJTdGVwLmJpbmQodGhpcykpKX19LHtrZXk6Il9yZW5kZXJTdGVwIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5yZW5kZXJpbmdBY3RpdmUmJih0aGlzLnJlbmRlclRpbWVyPXZvaWQgMCwhMD09PXRoaXMucmVxdWlyZXNUaW1lb3V0JiZ0aGlzLl9zdGFydFJlbmRlcmluZygpLHRoaXMuX3JlZHJhdygpLCExPT09dGhpcy5yZXF1aXJlc1RpbWVvdXQmJnRoaXMuX3N0YXJ0UmVuZGVyaW5nKCkpfX0se2tleToicmVkcmF3Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoInNldFNpemUiKSx0aGlzLl9yZWRyYXcoKX19LHtrZXk6Il9yZXF1ZXN0UmVkcmF3Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7ITAhPT10aGlzLnJlZHJhd1JlcXVlc3RlZCYmITE9PT10aGlzLnJlbmRlcmluZ0FjdGl2ZSYmITA9PT10aGlzLmFsbG93UmVkcmF3JiYodGhpcy5yZWRyYXdSZXF1ZXN0ZWQ9ITAsITA9PT10aGlzLnJlcXVpcmVzVGltZW91dD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3QuX3JlZHJhdyghMSl9LDApOndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0Ll9yZWRyYXcoITEpfSkpfX0se2tleToiX3JlZHJhdyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2lmKCEwPT09dGhpcy5hbGxvd1JlZHJhdyl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiaW5pdFJlZHJhdyIpLHRoaXMucmVkcmF3UmVxdWVzdGVkPSExO3ZhciBlPXRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOzAhPT10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMud2lkdGgmJjAhPT10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuaGVpZ2h0fHx0aGlzLmNhbnZhcy5zZXRTaXplKCksdGhpcy5waXhlbFJhdGlvPSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSkvKGUud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8ZS5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxlLm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8ZS5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8ZS5iYWNraW5nU3RvcmVQaXhlbFJhdGlvfHwxKSxlLnNldFRyYW5zZm9ybSh0aGlzLnBpeGVsUmF0aW8sMCwwLHRoaXMucGl4ZWxSYXRpbywwLDApO3ZhciBpPXRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCxvPXRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQ7aWYoZS5jbGVhclJlY3QoMCwwLGksbyksMD09PXRoaXMuY2FudmFzLmZyYW1lLmNsaWVudFdpZHRoKXJldHVybjtlLnNhdmUoKSxlLnRyYW5zbGF0ZSh0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54LHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnkpLGUuc2NhbGUodGhpcy5ib2R5LnZpZXcuc2NhbGUsdGhpcy5ib2R5LnZpZXcuc2NhbGUpLGUuYmVnaW5QYXRoKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiYmVmb3JlRHJhd2luZyIsZSksZS5jbG9zZVBhdGgoKSwhMT09PXQmJighMT09PXRoaXMuZHJhZ2dpbmd8fCEwPT09dGhpcy5kcmFnZ2luZyYmITE9PT10aGlzLm9wdGlvbnMuaGlkZUVkZ2VzT25EcmFnKSYmdGhpcy5fZHJhd0VkZ2VzKGUpLCghMT09PXRoaXMuZHJhZ2dpbmd8fCEwPT09dGhpcy5kcmFnZ2luZyYmITE9PT10aGlzLm9wdGlvbnMuaGlkZU5vZGVzT25EcmFnKSYmdGhpcy5fZHJhd05vZGVzKGUsdCksZS5iZWdpblBhdGgoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJhZnRlckRyYXdpbmciLGUpLGUuY2xvc2VQYXRoKCksZS5yZXN0b3JlKCksITA9PT10JiZlLmNsZWFyUmVjdCgwLDAsaSxvKX19fSx7a2V5OiJfcmVzaXplTm9kZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jYW52YXMuZnJhbWUuY2FudmFzLmdldENvbnRleHQoIjJkIik7dm9pZCAwPT09dGhpcy5waXhlbFJhdGlvJiYodGhpcy5waXhlbFJhdGlvPSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSkvKHQud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvfHwxKSksdC5zZXRUcmFuc2Zvcm0odGhpcy5waXhlbFJhdGlvLDAsMCx0aGlzLnBpeGVsUmF0aW8sMCwwKSx0LnNhdmUoKSx0LnRyYW5zbGF0ZSh0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54LHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnkpLHQuc2NhbGUodGhpcy5ib2R5LnZpZXcuc2NhbGUsdGhpcy5ib2R5LnZpZXcuc2NhbGUpO3ZhciBlPXRoaXMuYm9keS5ub2RlcyxpPXZvaWQgMDtmb3IodmFyIG8gaW4gZSllLmhhc093blByb3BlcnR5KG8pJiYoaT1lW29dLGkucmVzaXplKHQpLGkudXBkYXRlQm91bmRpbmdCb3godCxpLnNlbGVjdGVkKSk7dC5yZXN0b3JlKCl9fSx7a2V5OiJfZHJhd05vZGVzIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxpPXRoaXMuYm9keS5ub2RlcyxvPXRoaXMuYm9keS5ub2RlSW5kaWNlcyxuPXZvaWQgMCxzPVtdLHI9dGhpcy5jYW52YXMuRE9NdG9DYW52YXMoe3g6LTIwLHk6LTIwfSksYT10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh7eDp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgrMjAseTp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0KzIwfSksaD17dG9wOnIueSxsZWZ0OnIueCxib3R0b206YS55LHJpZ2h0OmEueH0sZD0wO2Q8by5sZW5ndGg7ZCsrKW49aVtvW2RdXSxuLmlzU2VsZWN0ZWQoKT9zLnB1c2gob1tkXSk6ITA9PT1lP24uZHJhdyh0KTohMD09PW4uaXNCb3VuZGluZ0JveE92ZXJsYXBwaW5nV2l0aChoKT9uLmRyYXcodCk6bi51cGRhdGVCb3VuZGluZ0JveCh0LG4uc2VsZWN0ZWQpO2Zvcih2YXIgbD0wO2w8cy5sZW5ndGg7bCsrKW49aVtzW2xdXSxuLmRyYXcodCl9fSx7a2V5OiJfZHJhd0VkZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5LmVkZ2VzLGk9dGhpcy5ib2R5LmVkZ2VJbmRpY2VzLG89dm9pZCAwLG49MDtuPGkubGVuZ3RoO24rKylvPWVbaVtuXV0sITA9PT1vLmNvbm5lY3RlZCYmby5kcmF3KHQpfX0se2tleToiX2RldGVybWluZUJyb3dzZXJNZXRob2QiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpe3ZhciB0PW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTt0aGlzLnJlcXVpcmVzVGltZW91dD0hMSwtMSE9dC5pbmRleE9mKCJtc2llIDkuMCIpP3RoaXMucmVxdWlyZXNUaW1lb3V0PSEwOi0xIT10LmluZGV4T2YoInNhZmFyaSIpJiZ0LmluZGV4T2YoImNocm9tZSIpPD0tMSYmKHRoaXMucmVxdWlyZXNUaW1lb3V0PSEwKX1lbHNlIHRoaXMucmVxdWlyZXNUaW1lb3V0PSEwfX1dKSx0fSgpO2UuZGVmYXVsdD1kfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTM0KSxzPW8obikscj1pKDEzNSksYT1vKHIpLGg9aSgxMTIpLGQ9aSgxMTkpLGw9aSgxKSx1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5waXhlbFJhdGlvPTEsdGhpcy5yZXNpemVUaW1lcj12b2lkIDAsdGhpcy5yZXNpemVGdW5jdGlvbj10aGlzLl9vblJlc2l6ZS5iaW5kKHRoaXMpLHRoaXMuY2FtZXJhU3RhdGU9e30sdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLmNhbnZhc1ZpZXdDZW50ZXI9e30sdGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e2F1dG9SZXNpemU6ITAsaGVpZ2h0OiIxMDAlIix3aWR0aDoiMTAwJSJ9LGwuZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmJpbmRFdmVudExpc3RlbmVycygpfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleToiYmluZEV2ZW50TGlzdGVuZXJzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub25jZSgicmVzaXplIixmdW5jdGlvbihlKXswIT09ZS53aWR0aCYmKHQuYm9keS52aWV3LnRyYW5zbGF0aW9uLng9LjUqZS53aWR0aCksMCE9PWUuaGVpZ2h0JiYodC5ib2R5LnZpZXcudHJhbnNsYXRpb24ueT0uNSplLmhlaWdodCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigic2V0U2l6ZSIsdGhpcy5zZXRTaXplLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJkZXN0cm95IixmdW5jdGlvbigpe3QuaGFtbWVyRnJhbWUuZGVzdHJveSgpLHQuaGFtbWVyLmRlc3Ryb3koKSx0Ll9jbGVhblVwKCl9KX19LHtrZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodm9pZCAwIT09dCl7dmFyIGk9WyJ3aWR0aCIsImhlaWdodCIsImF1dG9SZXNpemUiXTtsLnNlbGVjdGl2ZURlZXBFeHRlbmQoaSx0aGlzLm9wdGlvbnMsdCl9ITA9PT10aGlzLm9wdGlvbnMuYXV0b1Jlc2l6ZSYmKHRoaXMuX2NsZWFuVXAoKSx0aGlzLnJlc2l6ZVRpbWVyPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ITA9PT1lLnNldFNpemUoKSYmZS5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlcXVlc3RSZWRyYXciKX0sMWUzKSx0aGlzLnJlc2l6ZUZ1bmN0aW9uPXRoaXMuX29uUmVzaXplLmJpbmQodGhpcyksbC5hZGRFdmVudExpc3RlbmVyKHdpbmRvdywicmVzaXplIix0aGlzLnJlc2l6ZUZ1bmN0aW9uKSl9fSx7a2V5OiJfY2xlYW5VcCIsdmFsdWU6ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLnJlc2l6ZVRpbWVyJiZjbGVhckludGVydmFsKHRoaXMucmVzaXplVGltZXIpLGwucmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsdGhpcy5yZXNpemVGdW5jdGlvbiksdGhpcy5yZXNpemVGdW5jdGlvbj12b2lkIDB9fSx7a2V5OiJfb25SZXNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zZXRTaXplKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlZHJhdyIpfX0se2tleToiX2dldENhbWVyYVN0YXRlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp0aGlzLnBpeGVsUmF0aW87ITA9PT10aGlzLmluaXRpYWxpemVkJiYodGhpcy5jYW1lcmFTdGF0ZS5wcmV2aW91c1dpZHRoPXRoaXMuZnJhbWUuY2FudmFzLndpZHRoL3QsdGhpcy5jYW1lcmFTdGF0ZS5wcmV2aW91c0hlaWdodD10aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQvdCx0aGlzLmNhbWVyYVN0YXRlLnNjYWxlPXRoaXMuYm9keS52aWV3LnNjYWxlLHRoaXMuY2FtZXJhU3RhdGUucG9zaXRpb249dGhpcy5ET010b0NhbnZhcyh7eDouNSp0aGlzLmZyYW1lLmNhbnZhcy53aWR0aC90LHk6LjUqdGhpcy5mcmFtZS5jYW52YXMuaGVpZ2h0L3R9KSl9fSx7a2V5OiJfc2V0Q2FtZXJhU3RhdGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodm9pZCAwIT09dGhpcy5jYW1lcmFTdGF0ZS5zY2FsZSYmMCE9PXRoaXMuZnJhbWUuY2FudmFzLmNsaWVudFdpZHRoJiYwIT09dGhpcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0JiYwIT09dGhpcy5waXhlbFJhdGlvJiZ0aGlzLmNhbWVyYVN0YXRlLnByZXZpb3VzV2lkdGg+MCl7dmFyIHQ9dGhpcy5mcmFtZS5jYW52YXMud2lkdGgvdGhpcy5waXhlbFJhdGlvL3RoaXMuY2FtZXJhU3RhdGUucHJldmlvdXNXaWR0aCxlPXRoaXMuZnJhbWUuY2FudmFzLmhlaWdodC90aGlzLnBpeGVsUmF0aW8vdGhpcy5jYW1lcmFTdGF0ZS5wcmV2aW91c0hlaWdodCxpPXRoaXMuY2FtZXJhU3RhdGUuc2NhbGU7MSE9dCYmMSE9ZT9pPS41KnRoaXMuY2FtZXJhU3RhdGUuc2NhbGUqKHQrZSk6MSE9dD9pPXRoaXMuY2FtZXJhU3RhdGUuc2NhbGUqdDoxIT1lJiYoaT10aGlzLmNhbWVyYVN0YXRlLnNjYWxlKmUpLHRoaXMuYm9keS52aWV3LnNjYWxlPWk7dmFyIG89dGhpcy5ET010b0NhbnZhcyh7eDouNSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx5Oi41KnRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodH0pLG49e3g6by54LXRoaXMuY2FtZXJhU3RhdGUucG9zaXRpb24ueCx5Om8ueS10aGlzLmNhbWVyYVN0YXRlLnBvc2l0aW9uLnl9O3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLngrPW4ueCp0aGlzLmJvZHkudmlldy5zY2FsZSx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi55Kz1uLnkqdGhpcy5ib2R5LnZpZXcuc2NhbGV9fX0se2tleToiX3ByZXBhcmVWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0KyJweCI7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigtMSE9PXQuaW5kZXhPZigiJSIpfHwtMSE9PXQuaW5kZXhPZigicHgiKSlyZXR1cm4gdDtpZigtMT09PXQuaW5kZXhPZigiJSIpKXJldHVybiB0KyJweCJ9dGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgdXNlIHRoZSB2YWx1ZSBzdXBwbGllZCBmb3Igd2lkdGggb3IgaGVpZ2h0OiIrdCl9fSx7a2V5OiJfY3JlYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcig7dGhpcy5ib2R5LmNvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCk7KXRoaXMuYm9keS5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5ib2R5LmNvbnRhaW5lci5maXJzdENoaWxkKTtpZih0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZnJhbWUuY2xhc3NOYW1lPSJ2aXMtbmV0d29yayIsdGhpcy5mcmFtZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLHRoaXMuZnJhbWUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsdGhpcy5mcmFtZS50YWJJbmRleD05MDAsdGhpcy5mcmFtZS5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksdGhpcy5mcmFtZS5jYW52YXMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUuY2FudmFzKSx0aGlzLmZyYW1lLmNhbnZhcy5nZXRDb250ZXh0KXt2YXIgdD10aGlzLmZyYW1lLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpO3RoaXMuX3NldFBpeGVsUmF0aW8odCksdGhpcy5mcmFtZS5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKS5zZXRUcmFuc2Zvcm0odGhpcy5waXhlbFJhdGlvLDAsMCx0aGlzLnBpeGVsUmF0aW8sMCwwKX1lbHNle3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpO2Uuc3R5bGUuY29sb3I9InJlZCIsZS5zdHlsZS5mb250V2VpZ2h0PSJib2xkIixlLnN0eWxlLnBhZGRpbmc9IjEwcHgiLGUuaW5uZXJIVE1MPSJFcnJvcjogeW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgSFRNTCBjYW52YXMiLHRoaXMuZnJhbWUuY2FudmFzLmFwcGVuZENoaWxkKGUpfXRoaXMuYm9keS5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSksdGhpcy5ib2R5LnZpZXcuc2NhbGU9MSx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj17eDouNSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx5Oi41KnRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodH0sdGhpcy5fYmluZEhhbW1lcigpfX0se2tleToiX2JpbmRIYW1tZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt2b2lkIDAhPT10aGlzLmhhbW1lciYmdGhpcy5oYW1tZXIuZGVzdHJveSgpLHRoaXMuZHJhZz17fSx0aGlzLnBpbmNoPXt9LHRoaXMuaGFtbWVyPW5ldyBoKHRoaXMuZnJhbWUuY2FudmFzKSx0aGlzLmhhbW1lci5nZXQoInBpbmNoIikuc2V0KHtlbmFibGU6ITB9KSx0aGlzLmhhbW1lci5nZXQoInBhbiIpLnNldCh7dGhyZXNob2xkOjUsZGlyZWN0aW9uOmguRElSRUNUSU9OX0FMTH0pLGQub25Ub3VjaCh0aGlzLmhhbW1lcixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Ub3VjaChlKX0pLHRoaXMuaGFtbWVyLm9uKCJ0YXAiLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vblRhcChlKX0pLHRoaXMuaGFtbWVyLm9uKCJkb3VibGV0YXAiLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vbkRvdWJsZVRhcChlKX0pLHRoaXMuaGFtbWVyLm9uKCJwcmVzcyIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uSG9sZChlKX0pLHRoaXMuaGFtbWVyLm9uKCJwYW5zdGFydCIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uRHJhZ1N0YXJ0KGUpfSksdGhpcy5oYW1tZXIub24oInBhbm1vdmUiLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vbkRyYWcoZSl9KSx0aGlzLmhhbW1lci5vbigicGFuZW5kIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnRW5kKGUpfSksdGhpcy5oYW1tZXIub24oInBpbmNoIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25QaW5jaChlKX0pLHRoaXMuZnJhbWUuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNld2hlZWwiLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vbk1vdXNlV2hlZWwoZSl9KSx0aGlzLmZyYW1lLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJET01Nb3VzZVNjcm9sbCIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uTW91c2VXaGVlbChlKX0pLHRoaXMuZnJhbWUuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uTW91c2VNb3ZlKGUpfSksdGhpcy5mcmFtZS5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vbkNvbnRleHQoZSl9KSx0aGlzLmhhbW1lckZyYW1lPW5ldyBoKHRoaXMuZnJhbWUpLGQub25SZWxlYXNlKHRoaXMuaGFtbWVyRnJhbWUsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uUmVsZWFzZShlKX0pfX0se2tleToic2V0U2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5vcHRpb25zLndpZHRoLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMub3B0aW9ucy5oZWlnaHQ7dD10aGlzLl9wcmVwYXJlVmFsdWUodCksZT10aGlzLl9wcmVwYXJlVmFsdWUoZSk7dmFyIGk9ITEsbz10aGlzLmZyYW1lLmNhbnZhcy53aWR0aCxuPXRoaXMuZnJhbWUuY2FudmFzLmhlaWdodCxzPXRoaXMuZnJhbWUuY2FudmFzLmdldENvbnRleHQoIjJkIikscj10aGlzLnBpeGVsUmF0aW87aWYodGhpcy5fc2V0UGl4ZWxSYXRpbyhzKSx0IT10aGlzLm9wdGlvbnMud2lkdGh8fGUhPXRoaXMub3B0aW9ucy5oZWlnaHR8fHRoaXMuZnJhbWUuc3R5bGUud2lkdGghPXR8fHRoaXMuZnJhbWUuc3R5bGUuaGVpZ2h0IT1lKXRoaXMuX2dldENhbWVyYVN0YXRlKHIpLHRoaXMuZnJhbWUuc3R5bGUud2lkdGg9dCx0aGlzLmZyYW1lLnN0eWxlLmhlaWdodD1lLHRoaXMuZnJhbWUuY2FudmFzLnN0eWxlLndpZHRoPSIxMDAlIix0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS5oZWlnaHQ9IjEwMCUiLHRoaXMuZnJhbWUuY2FudmFzLndpZHRoPU1hdGgucm91bmQodGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgqdGhpcy5waXhlbFJhdGlvKSx0aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQ9TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQqdGhpcy5waXhlbFJhdGlvKSx0aGlzLm9wdGlvbnMud2lkdGg9dCx0aGlzLm9wdGlvbnMuaGVpZ2h0PWUsdGhpcy5jYW52YXNWaWV3Q2VudGVyPXt4Oi41KnRoaXMuZnJhbWUuY2xpZW50V2lkdGgseTouNSp0aGlzLmZyYW1lLmNsaWVudEhlaWdodH0saT0hMDtlbHNle3ZhciBhPU1hdGgucm91bmQodGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgqdGhpcy5waXhlbFJhdGlvKSxoPU1hdGgucm91bmQodGhpcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0KnRoaXMucGl4ZWxSYXRpbyk7dGhpcy5mcmFtZS5jYW52YXMud2lkdGg9PT1hJiZ0aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQ9PT1ofHx0aGlzLl9nZXRDYW1lcmFTdGF0ZShyKSx0aGlzLmZyYW1lLmNhbnZhcy53aWR0aCE9PWEmJih0aGlzLmZyYW1lLmNhbnZhcy53aWR0aD1hLGk9ITApLHRoaXMuZnJhbWUuY2FudmFzLmhlaWdodCE9PWgmJih0aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQ9aCxpPSEwKX1yZXR1cm4hMD09PWkmJih0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJyZXNpemUiLHt3aWR0aDpNYXRoLnJvdW5kKHRoaXMuZnJhbWUuY2FudmFzLndpZHRoL3RoaXMucGl4ZWxSYXRpbyksaGVpZ2h0Ok1hdGgucm91bmQodGhpcy5mcmFtZS5jYW52YXMuaGVpZ2h0L3RoaXMucGl4ZWxSYXRpbyksb2xkV2lkdGg6TWF0aC5yb3VuZChvL3RoaXMucGl4ZWxSYXRpbyksb2xkSGVpZ2h0Ok1hdGgucm91bmQobi90aGlzLnBpeGVsUmF0aW8pfSksdGhpcy5fc2V0Q2FtZXJhU3RhdGUoKSksdGhpcy5pbml0aWFsaXplZD0hMCxpfX0se2tleToiX3NldFBpeGVsUmF0aW8iLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMucGl4ZWxSYXRpbz0od2luZG93LmRldmljZVBpeGVsUmF0aW98fDEpLyh0LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQuYmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8MSl9fSx7a2V5OiJfWGNvbnZlcnRET010b0NhbnZhcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueCkvdGhpcy5ib2R5LnZpZXcuc2NhbGV9fSx7a2V5OiJfWGNvbnZlcnRDYW52YXNUb0RPTSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5ib2R5LnZpZXcuc2NhbGUrdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueH19LHtrZXk6Il9ZY29udmVydERPTXRvQ2FudmFzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi55KS90aGlzLmJvZHkudmlldy5zY2FsZX19LHtrZXk6Il9ZY29udmVydENhbnZhc1RvRE9NIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmJvZHkudmlldy5zY2FsZSt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi55fX0se2tleToiY2FudmFzVG9ET00iLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybnt4OnRoaXMuX1hjb252ZXJ0Q2FudmFzVG9ET00odC54KSx5OnRoaXMuX1ljb252ZXJ0Q2FudmFzVG9ET00odC55KX19fSx7a2V5OiJET010b0NhbnZhcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJue3g6dGhpcy5fWGNvbnZlcnRET010b0NhbnZhcyh0LngpLHk6dGhpcy5fWWNvbnZlcnRET010b0NhbnZhcyh0LnkpfX19XSksdH0oKTtlLmRlZmF1bHQ9dX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDEzNCkscz1vKG4pLHI9aSgxMzUpLGE9byhyKSxoPWkoMSksZD1pKDIxOSkuZGVmYXVsdCxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGkpe3ZhciBvPXRoaXM7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2FudmFzPWksdGhpcy5hbmltYXRpb25TcGVlZD0xL3RoaXMucmVuZGVyUmVmcmVzaFJhdGUsdGhpcy5hbmltYXRpb25FYXNpbmdGdW5jdGlvbj0iZWFzZUluT3V0UXVpbnQiLHRoaXMuZWFzaW5nVGltZT0wLHRoaXMuc291cmNlU2NhbGU9MCx0aGlzLnRhcmdldFNjYWxlPTAsdGhpcy5zb3VyY2VUcmFuc2xhdGlvbj0wLHRoaXMudGFyZ2V0VHJhbnNsYXRpb249MCx0aGlzLmxvY2tlZE9uTm9kZUlkPXZvaWQgMCx0aGlzLmxvY2tlZE9uTm9kZU9mZnNldD12b2lkIDAsdGhpcy50b3VjaFRpbWU9MCx0aGlzLnZpZXdGdW5jdGlvbj12b2lkIDAsdGhpcy5ib2R5LmVtaXR0ZXIub24oImZpdCIsdGhpcy5maXQuYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oImFuaW1hdGlvbkZpbmlzaGVkIixmdW5jdGlvbigpe28uYm9keS5lbWl0dGVyLmVtaXQoIl9zdG9wUmVuZGVyaW5nIil9KSwKdGhpcy5ib2R5LmVtaXR0ZXIub24oInVubG9ja05vZGUiLHRoaXMucmVsZWFzZU5vZGUuYmluZCh0aGlzKSl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTt0aGlzLm9wdGlvbnM9dH19LHtrZXk6ImZpdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e25vZGVzOltdfSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0saT12b2lkIDAsbz12b2lkIDA7aWYodm9pZCAwIT09dC5ub2RlcyYmMCE9PXQubm9kZXMubGVuZ3RofHwodC5ub2Rlcz10aGlzLmJvZHkubm9kZUluZGljZXMpLCEwPT09ZSl7dmFyIG49MDtmb3IodmFyIHMgaW4gdGhpcy5ib2R5Lm5vZGVzKWlmKHRoaXMuYm9keS5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShzKSl7dmFyIHI9dGhpcy5ib2R5Lm5vZGVzW3NdOyEwPT09ci5wcmVkZWZpbmVkUG9zaXRpb24mJihuKz0xKX1pZihuPi41KnRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5maXQodCwhMSk7aT1kLmdldFJhbmdlKHRoaXMuYm9keS5ub2Rlcyx0Lm5vZGVzKTtvPTEyLjY2Mi8odGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aCs3LjQxNDcpKy4wOTY0ODIyO28qPU1hdGgubWluKHRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aC82MDAsdGhpcy5jYW52YXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodC82MDApfWVsc2V7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3Jlc2l6ZU5vZGVzIiksaT1kLmdldFJhbmdlKHRoaXMuYm9keS5ub2Rlcyx0Lm5vZGVzKTt2YXIgYT0xLjEqTWF0aC5hYnMoaS5tYXhYLWkubWluWCksaD0xLjEqTWF0aC5hYnMoaS5tYXhZLWkubWluWSksbD10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgvYSx1PXRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQvaDtvPWw8PXU/bDp1fW8+MT9vPTE6MD09PW8mJihvPTEpO3ZhciBjPWQuZmluZENlbnRlcihpKSxwPXtwb3NpdGlvbjpjLHNjYWxlOm8sYW5pbWF0aW9uOnQuYW5pbWF0aW9ufTt0aGlzLm1vdmVUbyhwKX19LHtrZXk6ImZvY3VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYodm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW3RdKXt2YXIgaT17eDp0aGlzLmJvZHkubm9kZXNbdF0ueCx5OnRoaXMuYm9keS5ub2Rlc1t0XS55fTtlLnBvc2l0aW9uPWksZS5sb2NrZWRPbk5vZGU9dCx0aGlzLm1vdmVUbyhlKX1lbHNlIGNvbnNvbGUubG9nKCJOb2RlOiAiK3QrIiBjYW5ub3QgYmUgZm91bmQuIil9fSx7a2V5OiJtb3ZlVG8iLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHZvaWQodD17fSk7dm9pZCAwPT09dC5vZmZzZXQmJih0Lm9mZnNldD17eDowLHk6MH0pLHZvaWQgMD09PXQub2Zmc2V0LngmJih0Lm9mZnNldC54PTApLHZvaWQgMD09PXQub2Zmc2V0LnkmJih0Lm9mZnNldC55PTApLHZvaWQgMD09PXQuc2NhbGUmJih0LnNjYWxlPXRoaXMuYm9keS52aWV3LnNjYWxlKSx2b2lkIDA9PT10LnBvc2l0aW9uJiYodC5wb3NpdGlvbj10aGlzLmdldFZpZXdQb3NpdGlvbigpKSx2b2lkIDA9PT10LmFuaW1hdGlvbiYmKHQuYW5pbWF0aW9uPXtkdXJhdGlvbjowfSksITE9PT10LmFuaW1hdGlvbiYmKHQuYW5pbWF0aW9uPXtkdXJhdGlvbjowfSksITA9PT10LmFuaW1hdGlvbiYmKHQuYW5pbWF0aW9uPXt9KSx2b2lkIDA9PT10LmFuaW1hdGlvbi5kdXJhdGlvbiYmKHQuYW5pbWF0aW9uLmR1cmF0aW9uPTFlMyksdm9pZCAwPT09dC5hbmltYXRpb24uZWFzaW5nRnVuY3Rpb24mJih0LmFuaW1hdGlvbi5lYXNpbmdGdW5jdGlvbj0iZWFzZUluT3V0UXVhZCIpLHRoaXMuYW5pbWF0ZVZpZXcodCl9fSx7a2V5OiJhbmltYXRlVmlldyIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dGhpcy5hbmltYXRpb25FYXNpbmdGdW5jdGlvbj10LmFuaW1hdGlvbi5lYXNpbmdGdW5jdGlvbix0aGlzLnJlbGVhc2VOb2RlKCksITA9PT10LmxvY2tlZCYmKHRoaXMubG9ja2VkT25Ob2RlSWQ9dC5sb2NrZWRPbk5vZGUsdGhpcy5sb2NrZWRPbk5vZGVPZmZzZXQ9dC5vZmZzZXQpLDAhPXRoaXMuZWFzaW5nVGltZSYmdGhpcy5fdHJhbnNpdGlvblJlZHJhdyghMCksdGhpcy5zb3VyY2VTY2FsZT10aGlzLmJvZHkudmlldy5zY2FsZSx0aGlzLnNvdXJjZVRyYW5zbGF0aW9uPXRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLHRoaXMudGFyZ2V0U2NhbGU9dC5zY2FsZSx0aGlzLmJvZHkudmlldy5zY2FsZT10aGlzLnRhcmdldFNjYWxlO3ZhciBlPXRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKHt4Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx5Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHR9KSxpPXt4OmUueC10LnBvc2l0aW9uLngseTplLnktdC5wb3NpdGlvbi55fTt0aGlzLnRhcmdldFRyYW5zbGF0aW9uPXt4OnRoaXMuc291cmNlVHJhbnNsYXRpb24ueCtpLngqdGhpcy50YXJnZXRTY2FsZSt0Lm9mZnNldC54LHk6dGhpcy5zb3VyY2VUcmFuc2xhdGlvbi55K2kueSp0aGlzLnRhcmdldFNjYWxlK3Qub2Zmc2V0Lnl9LDA9PT10LmFuaW1hdGlvbi5kdXJhdGlvbj92b2lkIDAhPXRoaXMubG9ja2VkT25Ob2RlSWQ/KHRoaXMudmlld0Z1bmN0aW9uPXRoaXMuX2xvY2tlZFJlZHJhdy5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJpbml0UmVkcmF3Iix0aGlzLnZpZXdGdW5jdGlvbikpOih0aGlzLmJvZHkudmlldy5zY2FsZT10aGlzLnRhcmdldFNjYWxlLHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uPXRoaXMudGFyZ2V0VHJhbnNsYXRpb24sdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlcXVlc3RSZWRyYXciKSk6KHRoaXMuYW5pbWF0aW9uU3BlZWQ9MS8oNjAqdC5hbmltYXRpb24uZHVyYXRpb24qLjAwMSl8fDEvNjAsdGhpcy5hbmltYXRpb25FYXNpbmdGdW5jdGlvbj10LmFuaW1hdGlvbi5lYXNpbmdGdW5jdGlvbix0aGlzLnZpZXdGdW5jdGlvbj10aGlzLl90cmFuc2l0aW9uUmVkcmF3LmJpbmQodGhpcyksdGhpcy5ib2R5LmVtaXR0ZXIub24oImluaXRSZWRyYXciLHRoaXMudmlld0Z1bmN0aW9uKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfc3RhcnRSZW5kZXJpbmciKSl9fX0se2tleToiX2xvY2tlZFJlZHJhdyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD17eDp0aGlzLmJvZHkubm9kZXNbdGhpcy5sb2NrZWRPbk5vZGVJZF0ueCx5OnRoaXMuYm9keS5ub2Rlc1t0aGlzLmxvY2tlZE9uTm9kZUlkXS55fSxlPXRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKHt4Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx5Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHR9KSxpPXt4OmUueC10LngseTplLnktdC55fSxvPXRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLG49e3g6by54K2kueCp0aGlzLmJvZHkudmlldy5zY2FsZSt0aGlzLmxvY2tlZE9uTm9kZU9mZnNldC54LHk6by55K2kueSp0aGlzLmJvZHkudmlldy5zY2FsZSt0aGlzLmxvY2tlZE9uTm9kZU9mZnNldC55fTt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj1ufX0se2tleToicmVsZWFzZU5vZGUiLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5sb2NrZWRPbk5vZGVJZCYmdm9pZCAwIT09dGhpcy52aWV3RnVuY3Rpb24mJih0aGlzLmJvZHkuZW1pdHRlci5vZmYoImluaXRSZWRyYXciLHRoaXMudmlld0Z1bmN0aW9uKSx0aGlzLmxvY2tlZE9uTm9kZUlkPXZvaWQgMCx0aGlzLmxvY2tlZE9uTm9kZU9mZnNldD12b2lkIDApfX0se2tleToiX3RyYW5zaXRpb25SZWRyYXciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTt0aGlzLmVhc2luZ1RpbWUrPXRoaXMuYW5pbWF0aW9uU3BlZWQsdGhpcy5lYXNpbmdUaW1lPSEwPT09dD8xOnRoaXMuZWFzaW5nVGltZTt2YXIgZT1oLmVhc2luZ0Z1bmN0aW9uc1t0aGlzLmFuaW1hdGlvbkVhc2luZ0Z1bmN0aW9uXSh0aGlzLmVhc2luZ1RpbWUpO3RoaXMuYm9keS52aWV3LnNjYWxlPXRoaXMuc291cmNlU2NhbGUrKHRoaXMudGFyZ2V0U2NhbGUtdGhpcy5zb3VyY2VTY2FsZSkqZSx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj17eDp0aGlzLnNvdXJjZVRyYW5zbGF0aW9uLngrKHRoaXMudGFyZ2V0VHJhbnNsYXRpb24ueC10aGlzLnNvdXJjZVRyYW5zbGF0aW9uLngpKmUseTp0aGlzLnNvdXJjZVRyYW5zbGF0aW9uLnkrKHRoaXMudGFyZ2V0VHJhbnNsYXRpb24ueS10aGlzLnNvdXJjZVRyYW5zbGF0aW9uLnkpKmV9LHRoaXMuZWFzaW5nVGltZT49MSYmKHRoaXMuYm9keS5lbWl0dGVyLm9mZigiaW5pdFJlZHJhdyIsdGhpcy52aWV3RnVuY3Rpb24pLHRoaXMuZWFzaW5nVGltZT0wLHZvaWQgMCE9dGhpcy5sb2NrZWRPbk5vZGVJZCYmKHRoaXMudmlld0Z1bmN0aW9uPXRoaXMuX2xvY2tlZFJlZHJhdy5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJpbml0UmVkcmF3Iix0aGlzLnZpZXdGdW5jdGlvbikpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoImFuaW1hdGlvbkZpbmlzaGVkIikpfX0se2tleToiZ2V0U2NhbGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYm9keS52aWV3LnNjYWxlfX0se2tleToiZ2V0Vmlld1Bvc2l0aW9uIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbnZhcy5ET010b0NhbnZhcyh7eDouNSp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgseTouNSp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0fSl9fV0pLHR9KCk7ZS5kZWZhdWx0PWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxMzQpLHM9byhuKSxyPWkoMTM1KSxhPW8ociksaD1pKDEpLGQ9aSgyMjUpLmRlZmF1bHQsbD1pKDEzMykuZGVmYXVsdCx1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2FudmFzPWksdGhpcy5zZWxlY3Rpb25IYW5kbGVyPW8sdGhpcy5uYXZpZ2F0aW9uSGFuZGxlcj1uZXcgZChlLGkpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vblRhcD10aGlzLm9uVGFwLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uVG91Y2g9dGhpcy5vblRvdWNoLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uRG91YmxlVGFwPXRoaXMub25Eb3VibGVUYXAuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Ib2xkPXRoaXMub25Ib2xkLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uRHJhZ1N0YXJ0PXRoaXMub25EcmFnU3RhcnQuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnPXRoaXMub25EcmFnLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uRHJhZ0VuZD10aGlzLm9uRHJhZ0VuZC5iaW5kKHRoaXMpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vbk1vdXNlV2hlZWw9dGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25QaW5jaD10aGlzLm9uUGluY2guYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Nb3VzZU1vdmU9dGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vblJlbGVhc2U9dGhpcy5vblJlbGVhc2UuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Db250ZXh0PXRoaXMub25Db250ZXh0LmJpbmQodGhpcyksdGhpcy50b3VjaFRpbWU9MCx0aGlzLmRyYWc9e30sdGhpcy5waW5jaD17fSx0aGlzLnBvcHVwPXZvaWQgMCx0aGlzLnBvcHVwT2JqPXZvaWQgMCx0aGlzLnBvcHVwVGltZXI9dm9pZCAwLHRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcj10aGlzLmdldFBvaW50ZXIuYmluZCh0aGlzKSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17ZHJhZ05vZGVzOiEwLGRyYWdWaWV3OiEwLGhvdmVyOiExLGtleWJvYXJkOntlbmFibGVkOiExLHNwZWVkOnt4OjEwLHk6MTAsem9vbTouMDJ9LGJpbmRUb1dpbmRvdzohMH0sbmF2aWdhdGlvbkJ1dHRvbnM6ITEsdG9vbHRpcERlbGF5OjMwMCx6b29tVmlldzohMH0saC5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OiJiaW5kRXZlbnRMaXN0ZW5lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmJvZHkuZW1pdHRlci5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodC5wb3B1cFRpbWVyKSxkZWxldGUgdC5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyfSl9fSx7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10KXt2YXIgZT1bImhpZGVFZGdlc09uRHJhZyIsImhpZGVOb2Rlc09uRHJhZyIsImtleWJvYXJkIiwibXVsdGlzZWxlY3QiLCJzZWxlY3RhYmxlIiwic2VsZWN0Q29ubmVjdGVkRWRnZXMiXTtoLnNlbGVjdGl2ZU5vdERlZXBFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCksaC5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsImtleWJvYXJkIiksdC50b29sdGlwJiYoaC5leHRlbmQodGhpcy5vcHRpb25zLnRvb2x0aXAsdC50b29sdGlwKSx0LnRvb2x0aXAuY29sb3ImJih0aGlzLm9wdGlvbnMudG9vbHRpcC5jb2xvcj1oLnBhcnNlQ29sb3IodC50b29sdGlwLmNvbG9yKSkpfXRoaXMubmF2aWdhdGlvbkhhbmRsZXIuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpfX0se2tleToiZ2V0UG9pbnRlciIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJue3g6dC54LWguZ2V0QWJzb2x1dGVMZWZ0KHRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcykseTp0LnktaC5nZXRBYnNvbHV0ZVRvcCh0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMpfX19LHtrZXk6Im9uVG91Y2giLHZhbHVlOmZ1bmN0aW9uKHQpeyhuZXcgRGF0ZSkudmFsdWVPZigpLXRoaXMudG91Y2hUaW1lPjUwJiYodGhpcy5kcmFnLnBvaW50ZXI9dGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSx0aGlzLmRyYWcucGluY2hlZD0hMSx0aGlzLnBpbmNoLnNjYWxlPXRoaXMuYm9keS52aWV3LnNjYWxlLHRoaXMudG91Y2hUaW1lPShuZXcgRGF0ZSkudmFsdWVPZigpKX19LHtrZXk6Im9uVGFwIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFBvaW50ZXIodC5jZW50ZXIpLGk9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLm9wdGlvbnMubXVsdGlzZWxlY3QmJih0LmNoYW5nZWRQb2ludGVyc1swXS5jdHJsS2V5fHx0LmNoYW5nZWRQb2ludGVyc1swXS5tZXRhS2V5KTt0aGlzLmNoZWNrU2VsZWN0aW9uQ2hhbmdlcyhlLHQsaSksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImNsaWNrIix0LGUpfX0se2tleToib25Eb3VibGVUYXAiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlcik7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRvdWJsZUNsaWNrIix0LGUpfX0se2tleToib25Ib2xkIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFBvaW50ZXIodC5jZW50ZXIpLGk9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLm9wdGlvbnMubXVsdGlzZWxlY3Q7dGhpcy5jaGVja1NlbGVjdGlvbkNoYW5nZXMoZSx0LGkpLHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KCJjbGljayIsdCxlKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgiaG9sZCIsdCxlKX19LHtrZXk6Im9uUmVsZWFzZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoKG5ldyBEYXRlKS52YWx1ZU9mKCktdGhpcy50b3VjaFRpbWU+MTApe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlcik7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoInJlbGVhc2UiLHQsZSksdGhpcy50b3VjaFRpbWU9KG5ldyBEYXRlKS52YWx1ZU9mKCl9fX0se2tleToib25Db250ZXh0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFBvaW50ZXIoe3g6dC5jbGllbnRYLHk6dC5jbGllbnRZfSk7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoIm9uY29udGV4dCIsdCxlKX19LHtrZXk6ImNoZWNrU2VsZWN0aW9uQ2hhbmdlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZXRTZWxlY3RlZEVkZ2VDb3VudCgpLG49dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZXRTZWxlY3RlZE5vZGVDb3VudCgpLHM9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGlvbigpLHI9dm9pZCAwO3I9ITA9PT1pP3RoaXMuc2VsZWN0aW9uSGFuZGxlci5zZWxlY3RBZGRpdGlvbmFsT25Qb2ludCh0KTp0aGlzLnNlbGVjdGlvbkhhbmRsZXIuc2VsZWN0T25Qb2ludCh0KTt2YXIgYT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dldFNlbGVjdGVkRWRnZUNvdW50KCksaD10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dldFNlbGVjdGVkTm9kZUNvdW50KCksZD10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0U2VsZWN0aW9uKCksbD10aGlzLl9kZXRlcm1pbmVJZkRpZmZlcmVudChzLGQpLHU9bC5ub2Rlc0NoYW5nZWQsYz1sLmVkZ2VzQ2hhbmdlZCxwPSExO2gtbj4wPyh0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgic2VsZWN0Tm9kZSIsZSx0KSxyPSEwLHA9ITApOiEwPT09dSYmaD4wPyh0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgiZGVzZWxlY3ROb2RlIixlLHQscyksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoInNlbGVjdE5vZGUiLGUsdCkscD0hMCxyPSEwKTpoLW48MCYmKHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KCJkZXNlbGVjdE5vZGUiLGUsdCxzKSxyPSEwKSxhLW8+MCYmITE9PT1wPyh0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgic2VsZWN0RWRnZSIsZSx0KSxyPSEwKTphPjAmJiEwPT09Yz8odGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRlc2VsZWN0RWRnZSIsZSx0LHMpLHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KCJzZWxlY3RFZGdlIixlLHQpLHI9ITApOmEtbzwwJiYodGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRlc2VsZWN0RWRnZSIsZSx0LHMpLHI9ITApLCEwPT09ciYmdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoInNlbGVjdCIsZSx0KX19LHtrZXk6Il9kZXRlcm1pbmVJZkRpZmZlcmVudCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9ITEsbz0hMSxuPTA7bjx0Lm5vZGVzLmxlbmd0aDtuKyspLTE9PT1lLm5vZGVzLmluZGV4T2YodC5ub2Rlc1tuXSkmJihpPSEwKTtmb3IodmFyIHM9MDtzPGUubm9kZXMubGVuZ3RoO3MrKyktMT09PXQubm9kZXMuaW5kZXhPZih0Lm5vZGVzW3NdKSYmKGk9ITApO2Zvcih2YXIgcj0wO3I8dC5lZGdlcy5sZW5ndGg7cisrKS0xPT09ZS5lZGdlcy5pbmRleE9mKHQuZWRnZXNbcl0pJiYobz0hMCk7Zm9yKHZhciBhPTA7YTxlLmVkZ2VzLmxlbmd0aDthKyspLTE9PT10LmVkZ2VzLmluZGV4T2YodC5lZGdlc1thXSkmJihvPSEwKTtyZXR1cm57bm9kZXNDaGFuZ2VkOmksZWRnZXNDaGFuZ2VkOm99fX0se2tleToib25EcmFnU3RhcnQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZvaWQgMD09PXRoaXMuZHJhZy5wb2ludGVyJiZ0aGlzLm9uVG91Y2godCk7dmFyIGU9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldE5vZGVBdCh0aGlzLmRyYWcucG9pbnRlcik7aWYodGhpcy5kcmFnLmRyYWdnaW5nPSEwLHRoaXMuZHJhZy5zZWxlY3Rpb249W10sdGhpcy5kcmFnLnRyYW5zbGF0aW9uPWguZXh0ZW5kKHt9LHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uKSx0aGlzLmRyYWcubm9kZUlkPXZvaWQgMCx2b2lkIDAhPT1lJiYhMD09PXRoaXMub3B0aW9ucy5kcmFnTm9kZXMpe3RoaXMuZHJhZy5ub2RlSWQ9ZS5pZCwhMT09PWUuaXNTZWxlY3RlZCgpJiYodGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsKCksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNlbGVjdE9iamVjdChlKSksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRyYWdTdGFydCIsdCx0aGlzLmRyYWcucG9pbnRlcik7dmFyIGk9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNlbGVjdGlvbk9iai5ub2Rlcztmb3IodmFyIG8gaW4gaSlpZihpLmhhc093blByb3BlcnR5KG8pKXt2YXIgbj1pW29dLHM9e2lkOm4uaWQsbm9kZTpuLHg6bi54LHk6bi55LHhGaXhlZDpuLm9wdGlvbnMuZml4ZWQueCx5Rml4ZWQ6bi5vcHRpb25zLmZpeGVkLnl9O24ub3B0aW9ucy5maXhlZC54PSEwLG4ub3B0aW9ucy5maXhlZC55PSEwLHRoaXMuZHJhZy5zZWxlY3Rpb24ucHVzaChzKX19ZWxzZSB0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgiZHJhZ1N0YXJ0Iix0LHRoaXMuZHJhZy5wb2ludGVyLHZvaWQgMCwhMCl9fSx7a2V5OiJvbkRyYWciLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoITAhPT10aGlzLmRyYWcucGluY2hlZCl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgidW5sb2NrTm9kZSIpO3ZhciBpPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlciksbz10aGlzLmRyYWcuc2VsZWN0aW9uO2lmKG8mJm8ubGVuZ3RoJiYhMD09PXRoaXMub3B0aW9ucy5kcmFnTm9kZXMpe3RoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KCJkcmFnZ2luZyIsdCxpKTt2YXIgbj1pLngtdGhpcy5kcmFnLnBvaW50ZXIueCxzPWkueS10aGlzLmRyYWcucG9pbnRlci55O28uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgaT10Lm5vZGU7ITE9PT10LnhGaXhlZCYmKGkueD1lLmNhbnZhcy5fWGNvbnZlcnRET010b0NhbnZhcyhlLmNhbnZhcy5fWGNvbnZlcnRDYW52YXNUb0RPTSh0LngpK24pKSwhMT09PXQueUZpeGVkJiYoaS55PWUuY2FudmFzLl9ZY29udmVydERPTXRvQ2FudmFzKGUuY2FudmFzLl9ZY29udmVydENhbnZhc1RvRE9NKHQueSkrcykpfSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgic3RhcnRTaW11bGF0aW9uIil9ZWxzZSBpZighMD09PXRoaXMub3B0aW9ucy5kcmFnVmlldyl7aWYodGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRyYWdnaW5nIix0LGksdm9pZCAwLCEwKSx2b2lkIDA9PT10aGlzLmRyYWcucG9pbnRlcilyZXR1cm4gdm9pZCB0aGlzLm9uRHJhZ1N0YXJ0KHQpO3ZhciByPWkueC10aGlzLmRyYWcucG9pbnRlci54LGE9aS55LXRoaXMuZHJhZy5wb2ludGVyLnk7dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6dGhpcy5kcmFnLnRyYW5zbGF0aW9uLngrcix5OnRoaXMuZHJhZy50cmFuc2xhdGlvbi55K2F9LHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZWRyYXciKX19fX0se2tleToib25EcmFnRW5kIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmRyYWcuZHJhZ2dpbmc9ITE7dmFyIGU9dGhpcy5kcmFnLnNlbGVjdGlvbjtlJiZlLmxlbmd0aD8oZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Qubm9kZS5vcHRpb25zLmZpeGVkLng9dC54Rml4ZWQsdC5ub2RlLm9wdGlvbnMuZml4ZWQueT10LnlGaXhlZH0pLHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KCJkcmFnRW5kIix0LHRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlcikpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInN0YXJ0U2ltdWxhdGlvbiIpKToodGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRyYWdFbmQiLHQsdGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSx2b2lkIDAsITApLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXF1ZXN0UmVkcmF3IikpfX0se2tleToib25QaW5jaCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKTt0aGlzLmRyYWcucGluY2hlZD0hMCx2b2lkIDA9PT10aGlzLnBpbmNoLnNjYWxlJiYodGhpcy5waW5jaC5zY2FsZT0xKTt2YXIgaT10aGlzLnBpbmNoLnNjYWxlKnQuc2NhbGU7dGhpcy56b29tKGksZSl9fSx7a2V5OiJ6b29tIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKCEwPT09dGhpcy5vcHRpb25zLnpvb21WaWV3KXt2YXIgaT10aGlzLmJvZHkudmlldy5zY2FsZTt0PDFlLTUmJih0PTFlLTUpLHQ+MTAmJih0PTEwKTt2YXIgbz12b2lkIDA7dm9pZCAwIT09dGhpcy5kcmFnJiYhMD09PXRoaXMuZHJhZy5kcmFnZ2luZyYmKG89dGhpcy5jYW52YXMuRE9NdG9DYW52YXModGhpcy5kcmFnLnBvaW50ZXIpKTt2YXIgbj10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbixzPXQvaSxyPSgxLXMpKmUueCtuLngqcyxhPSgxLXMpKmUueStuLnkqcztpZih0aGlzLmJvZHkudmlldy5zY2FsZT10LHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uPXt4OnIseTphfSx2b2lkIDAhPW8pe3ZhciBoPXRoaXMuY2FudmFzLmNhbnZhc1RvRE9NKG8pO3RoaXMuZHJhZy5wb2ludGVyLng9aC54LHRoaXMuZHJhZy5wb2ludGVyLnk9aC55fXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXF1ZXN0UmVkcmF3IiksaTx0P3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoInpvb20iLHtkaXJlY3Rpb246IisiLHNjYWxlOnRoaXMuYm9keS52aWV3LnNjYWxlLHBvaW50ZXI6ZX0pOnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInpvb20iLHtkaXJlY3Rpb246Ii0iLHNjYWxlOnRoaXMuYm9keS52aWV3LnNjYWxlLHBvaW50ZXI6ZX0pfX19LHtrZXk6Im9uTW91c2VXaGVlbCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoITA9PT10aGlzLm9wdGlvbnMuem9vbVZpZXcpe3ZhciBlPTA7aWYodC53aGVlbERlbHRhP2U9dC53aGVlbERlbHRhLzEyMDp0LmRldGFpbCYmKGU9LXQuZGV0YWlsLzMpLDAhPT1lKXt2YXIgaT10aGlzLmJvZHkudmlldy5zY2FsZSxvPWUvMTA7ZTwwJiYoby89MS1vKSxpKj0xK287dmFyIG49dGhpcy5nZXRQb2ludGVyKHt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0pO3RoaXMuem9vbShpLG4pfXQucHJldmVudERlZmF1bHQoKX19fSx7a2V5OiJvbk1vdXNlTW92ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPXRoaXMuZ2V0UG9pbnRlcih7eDp0LmNsaWVudFgseTp0LmNsaWVudFl9KSxvPSExO2lmKHZvaWQgMCE9PXRoaXMucG9wdXAmJighMT09PXRoaXMucG9wdXAuaGlkZGVuJiZ0aGlzLl9jaGVja0hpZGVQb3B1cChpKSwhMT09PXRoaXMucG9wdXAuaGlkZGVuJiYobz0hMCx0aGlzLnBvcHVwLnNldFBvc2l0aW9uKGkueCszLGkueS01KSx0aGlzLnBvcHVwLnNob3coKSkpLCExPT09dGhpcy5vcHRpb25zLmtleWJvYXJkLmJpbmRUb1dpbmRvdyYmITA9PT10aGlzLm9wdGlvbnMua2V5Ym9hcmQuZW5hYmxlZCYmdGhpcy5jYW52YXMuZnJhbWUuZm9jdXMoKSwhMT09PW8mJih2b2lkIDAhPT10aGlzLnBvcHVwVGltZXImJihjbGVhckludGVydmFsKHRoaXMucG9wdXBUaW1lciksdGhpcy5wb3B1cFRpbWVyPXZvaWQgMCksdGhpcy5kcmFnLmRyYWdnaW5nfHwodGhpcy5wb3B1cFRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gZS5fY2hlY2tTaG93UG9wdXAoaSl9LHRoaXMub3B0aW9ucy50b29sdGlwRGVsYXkpKSksITA9PT10aGlzLm9wdGlvbnMuaG92ZXIpe3ZhciBuPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXROb2RlQXQoaSk7dm9pZCAwPT09biYmKG49dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldEVkZ2VBdChpKSksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLmhvdmVyT2JqZWN0KG4pfX19LHtrZXk6Il9jaGVja1Nob3dQb3B1cCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jYW52YXMuX1hjb252ZXJ0RE9NdG9DYW52YXModC54KSxpPXRoaXMuY2FudmFzLl9ZY29udmVydERPTXRvQ2FudmFzKHQueSksbz17bGVmdDplLHRvcDppLHJpZ2h0OmUsYm90dG9tOml9LG49dm9pZCAwPT09dGhpcy5wb3B1cE9iaj92b2lkIDA6dGhpcy5wb3B1cE9iai5pZCxzPSExLHI9Im5vZGUiO2lmKHZvaWQgMD09PXRoaXMucG9wdXBPYmope2Zvcih2YXIgYT10aGlzLmJvZHkubm9kZUluZGljZXMsaD10aGlzLmJvZHkubm9kZXMsZD12b2lkIDAsdT1bXSxjPTA7YzxhLmxlbmd0aDtjKyspZD1oW2FbY11dLCEwPT09ZC5pc092ZXJsYXBwaW5nV2l0aChvKSYmdm9pZCAwIT09ZC5nZXRUaXRsZSgpJiZ1LnB1c2goYVtjXSk7dS5sZW5ndGg+MCYmKHRoaXMucG9wdXBPYmo9aFt1W3UubGVuZ3RoLTFdXSxzPSEwKX1pZih2b2lkIDA9PT10aGlzLnBvcHVwT2JqJiYhMT09PXMpe2Zvcih2YXIgcD10aGlzLmJvZHkuZWRnZUluZGljZXMsZj10aGlzLmJvZHkuZWRnZXMsbT12b2lkIDAsdj1bXSxnPTA7ZzxwLmxlbmd0aDtnKyspbT1mW3BbZ11dLCEwPT09bS5pc092ZXJsYXBwaW5nV2l0aChvKSYmITA9PT1tLmNvbm5lY3RlZCYmdm9pZCAwIT09bS5nZXRUaXRsZSgpJiZ2LnB1c2gocFtnXSk7di5sZW5ndGg+MCYmKHRoaXMucG9wdXBPYmo9Zlt2W3YubGVuZ3RoLTFdXSxyPSJlZGdlIil9dm9pZCAwIT09dGhpcy5wb3B1cE9iaj90aGlzLnBvcHVwT2JqLmlkIT09biYmKHZvaWQgMD09PXRoaXMucG9wdXAmJih0aGlzLnBvcHVwPW5ldyBsKHRoaXMuY2FudmFzLmZyYW1lKSksdGhpcy5wb3B1cC5wb3B1cFRhcmdldFR5cGU9cix0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWQ9dGhpcy5wb3B1cE9iai5pZCx0aGlzLnBvcHVwLnNldFBvc2l0aW9uKHQueCszLHQueS01KSx0aGlzLnBvcHVwLnNldFRleHQodGhpcy5wb3B1cE9iai5nZXRUaXRsZSgpKSx0aGlzLnBvcHVwLnNob3coKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzaG93UG9wdXAiLHRoaXMucG9wdXBPYmouaWQpKTp2b2lkIDAhPT10aGlzLnBvcHVwJiYodGhpcy5wb3B1cC5oaWRlKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiaGlkZVBvcHVwIikpfX0se2tleToiX2NoZWNrSGlkZVBvcHVwIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX3BvaW50ZXJUb1Bvc2l0aW9uT2JqZWN0KHQpLGk9ITE7aWYoIm5vZGUiPT09dGhpcy5wb3B1cC5wb3B1cFRhcmdldFR5cGUpe2lmKHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWRdJiYhMD09PShpPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWRdLmlzT3ZlcmxhcHBpbmdXaXRoKGUpKSl7dmFyIG89dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldE5vZGVBdCh0KTtpPXZvaWQgMCE9PW8mJm8uaWQ9PT10aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWR9fWVsc2Ugdm9pZCAwPT09dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldE5vZGVBdCh0KSYmdm9pZCAwIT09dGhpcy5ib2R5LmVkZ2VzW3RoaXMucG9wdXAucG9wdXBUYXJnZXRJZF0mJihpPXRoaXMuYm9keS5lZGdlc1t0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWRdLmlzT3ZlcmxhcHBpbmdXaXRoKGUpKTshMT09PWkmJih0aGlzLnBvcHVwT2JqPXZvaWQgMCx0aGlzLnBvcHVwLmhpZGUoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJoaWRlUG9wdXAiKSl9fV0pLHR9KCk7ZS5kZWZhdWx0PXV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49aSgxMzQpLHM9byhuKSxyPWkoMTM1KSxhPW8ociksaD0oaSgxKSxpKDExMikpLGQ9aSgxMTkpLGw9aSgxMTUpLHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSl7dmFyIG89dGhpczsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5jYW52YXM9aSx0aGlzLmljb25zQ3JlYXRlZD0hMSx0aGlzLm5hdmlnYXRpb25IYW1tZXJzPVtdLHRoaXMuYm91bmRGdW5jdGlvbnM9e30sdGhpcy50b3VjaFRpbWU9MCx0aGlzLmFjdGl2YXRlZD0hMSx0aGlzLmJvZHkuZW1pdHRlci5vbigiYWN0aXZhdGUiLGZ1bmN0aW9uKCl7by5hY3RpdmF0ZWQ9ITAsby5jb25maWd1cmVLZXlib2FyZEJpbmRpbmdzKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiZGVhY3RpdmF0ZSIsZnVuY3Rpb24oKXtvLmFjdGl2YXRlZD0hMSxvLmNvbmZpZ3VyZUtleWJvYXJkQmluZGluZ3MoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJkZXN0cm95IixmdW5jdGlvbigpe3ZvaWQgMCE9PW8ua2V5Y2hhcm0mJm8ua2V5Y2hhcm0uZGVzdHJveSgpfSksdGhpcy5vcHRpb25zPXt9fXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwIT09dCYmKHRoaXMub3B0aW9ucz10LHRoaXMuY3JlYXRlKCkpfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5vcHRpb25zLm5hdmlnYXRpb25CdXR0b25zPyExPT09dGhpcy5pY29uc0NyZWF0ZWQmJnRoaXMubG9hZE5hdmlnYXRpb25FbGVtZW50cygpOiEwPT09dGhpcy5pY29uc0NyZWF0ZWQmJnRoaXMuY2xlYW5OYXZpZ2F0aW9uKCksdGhpcy5jb25maWd1cmVLZXlib2FyZEJpbmRpbmdzKCl9fSx7a2V5OiJjbGVhbk5hdmlnYXRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoMCE9dGhpcy5uYXZpZ2F0aW9uSGFtbWVycy5sZW5ndGgpe2Zvcih2YXIgdD0wO3Q8dGhpcy5uYXZpZ2F0aW9uSGFtbWVycy5sZW5ndGg7dCsrKXRoaXMubmF2aWdhdGlvbkhhbW1lcnNbdF0uZGVzdHJveSgpO3RoaXMubmF2aWdhdGlvbkhhbW1lcnM9W119dGhpcy5uYXZpZ2F0aW9uRE9NJiZ0aGlzLm5hdmlnYXRpb25ET00ud3JhcHBlciYmdGhpcy5uYXZpZ2F0aW9uRE9NLndyYXBwZXIucGFyZW50Tm9kZSYmdGhpcy5uYXZpZ2F0aW9uRE9NLndyYXBwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5hdmlnYXRpb25ET00ud3JhcHBlciksdGhpcy5pY29uc0NyZWF0ZWQ9ITF9fSx7a2V5OiJsb2FkTmF2aWdhdGlvbkVsZW1lbnRzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5jbGVhbk5hdmlnYXRpb24oKSx0aGlzLm5hdmlnYXRpb25ET009e307dmFyIGU9WyJ1cCIsImRvd24iLCJsZWZ0IiwicmlnaHQiLCJ6b29tSW4iLCJ6b29tT3V0Iiwiem9vbUV4dGVuZHMiXSxpPVsiX21vdmVVcCIsIl9tb3ZlRG93biIsIl9tb3ZlTGVmdCIsIl9tb3ZlUmlnaHQiLCJfem9vbUluIiwiX3pvb21PdXQiLCJfZml0Il07dGhpcy5uYXZpZ2F0aW9uRE9NLndyYXBwZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5uYXZpZ2F0aW9uRE9NLndyYXBwZXIuY2xhc3NOYW1lPSJ2aXMtbmF2aWdhdGlvbiIsdGhpcy5jYW52YXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5uYXZpZ2F0aW9uRE9NLndyYXBwZXIpO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKXt0aGlzLm5hdmlnYXRpb25ET01bZVtvXV09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5uYXZpZ2F0aW9uRE9NW2Vbb11dLmNsYXNzTmFtZT0idmlzLWJ1dHRvbiB2aXMtIitlW29dLHRoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyLmFwcGVuZENoaWxkKHRoaXMubmF2aWdhdGlvbkRPTVtlW29dXSk7dmFyIG49bmV3IGgodGhpcy5uYXZpZ2F0aW9uRE9NW2Vbb11dKTsiX2ZpdCI9PT1pW29dP2Qub25Ub3VjaChuLHRoaXMuX2ZpdC5iaW5kKHRoaXMpKTpkLm9uVG91Y2gobix0aGlzLmJpbmRUb1JlZHJhdy5iaW5kKHRoaXMsaVtvXSkpLHRoaXMubmF2aWdhdGlvbkhhbW1lcnMucHVzaChuKX12YXIgcz1uZXcgaCh0aGlzLmNhbnZhcy5mcmFtZSk7ZC5vblJlbGVhc2UocyxmdW5jdGlvbigpe3QuX3N0b3BNb3ZlbWVudCgpfSksdGhpcy5uYXZpZ2F0aW9uSGFtbWVycy5wdXNoKHMpLHRoaXMuaWNvbnNDcmVhdGVkPSEwfX0se2tleToiYmluZFRvUmVkcmF3Iix2YWx1ZTpmdW5jdGlvbih0KXt2b2lkIDA9PT10aGlzLmJvdW5kRnVuY3Rpb25zW3RdJiYodGhpcy5ib3VuZEZ1bmN0aW9uc1t0XT10aGlzW3RdLmJpbmQodGhpcyksdGhpcy5ib2R5LmVtaXR0ZXIub24oImluaXRSZWRyYXciLHRoaXMuYm91bmRGdW5jdGlvbnNbdF0pLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9zdGFydFJlbmRlcmluZyIpKX19LHtrZXk6InVuYmluZEZyb21SZWRyYXciLHZhbHVlOmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXRoaXMuYm91bmRGdW5jdGlvbnNbdF0mJih0aGlzLmJvZHkuZW1pdHRlci5vZmYoImluaXRSZWRyYXciLHRoaXMuYm91bmRGdW5jdGlvbnNbdF0pLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9zdG9wUmVuZGVyaW5nIiksZGVsZXRlIHRoaXMuYm91bmRGdW5jdGlvbnNbdF0pfX0se2tleToiX2ZpdCIsdmFsdWU6ZnVuY3Rpb24oKXsobmV3IERhdGUpLnZhbHVlT2YoKS10aGlzLnRvdWNoVGltZT43MDAmJih0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJmaXQiLHtkdXJhdGlvbjo3MDB9KSx0aGlzLnRvdWNoVGltZT0obmV3IERhdGUpLnZhbHVlT2YoKSl9fSx7a2V5OiJfc3RvcE1vdmVtZW50Iix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLmJvdW5kRnVuY3Rpb25zKXRoaXMuYm91bmRGdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodCkmJih0aGlzLmJvZHkuZW1pdHRlci5vZmYoImluaXRSZWRyYXciLHRoaXMuYm91bmRGdW5jdGlvbnNbdF0pLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9zdG9wUmVuZGVyaW5nIikpO3RoaXMuYm91bmRGdW5jdGlvbnM9e319fSx7a2V5OiJfbW92ZVVwIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnkrPXRoaXMub3B0aW9ucy5rZXlib2FyZC5zcGVlZC55fX0se2tleToiX21vdmVEb3duIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnktPXRoaXMub3B0aW9ucy5rZXlib2FyZC5zcGVlZC55fX0se2tleToiX21vdmVMZWZ0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLngrPXRoaXMub3B0aW9ucy5rZXlib2FyZC5zcGVlZC54fX0se2tleToiX21vdmVSaWdodCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54LT10aGlzLm9wdGlvbnMua2V5Ym9hcmQuc3BlZWQueH19LHtrZXk6Il96b29tSW4iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ib2R5LnZpZXcuc2NhbGUsZT10aGlzLmJvZHkudmlldy5zY2FsZSooMSt0aGlzLm9wdGlvbnMua2V5Ym9hcmQuc3BlZWQuem9vbSksaT10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbixvPWUvdCxuPSgxLW8pKnRoaXMuY2FudmFzLmNhbnZhc1ZpZXdDZW50ZXIueCtpLngqbyxzPSgxLW8pKnRoaXMuY2FudmFzLmNhbnZhc1ZpZXdDZW50ZXIueStpLnkqbzt0aGlzLmJvZHkudmlldy5zY2FsZT1lLHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uPXt4Om4seTpzfSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJ6b29tIix7ZGlyZWN0aW9uOiIrIixzY2FsZTp0aGlzLmJvZHkudmlldy5zY2FsZSxwb2ludGVyOm51bGx9KX19LHtrZXk6Il96b29tT3V0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS52aWV3LnNjYWxlLGU9dGhpcy5ib2R5LnZpZXcuc2NhbGUvKDErdGhpcy5vcHRpb25zLmtleWJvYXJkLnNwZWVkLnpvb20pLGk9dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24sbz1lL3Qsbj0oMS1vKSp0aGlzLmNhbnZhcy5jYW52YXNWaWV3Q2VudGVyLngraS54Km8scz0oMS1vKSp0aGlzLmNhbnZhcy5jYW52YXNWaWV3Q2VudGVyLnkraS55Km87dGhpcy5ib2R5LnZpZXcuc2NhbGU9ZSx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj17eDpuLHk6c30sdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiem9vbSIse2RpcmVjdGlvbjoiLSIsc2NhbGU6dGhpcy5ib2R5LnZpZXcuc2NhbGUscG9pbnRlcjpudWxsfSl9fSx7a2V5OiJjb25maWd1cmVLZXlib2FyZEJpbmRpbmdzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dm9pZCAwIT09dGhpcy5rZXljaGFybSYmdGhpcy5rZXljaGFybS5kZXN0cm95KCksITA9PT10aGlzLm9wdGlvbnMua2V5Ym9hcmQuZW5hYmxlZCYmKCEwPT09dGhpcy5vcHRpb25zLmtleWJvYXJkLmJpbmRUb1dpbmRvdz90aGlzLmtleWNoYXJtPWwoe2NvbnRhaW5lcjp3aW5kb3cscHJldmVudERlZmF1bHQ6ITB9KTp0aGlzLmtleWNoYXJtPWwoe2NvbnRhaW5lcjp0aGlzLmNhbnZhcy5mcmFtZSxwcmV2ZW50RGVmYXVsdDohMH0pLHRoaXMua2V5Y2hhcm0ucmVzZXQoKSwhMD09PXRoaXMuYWN0aXZhdGVkJiYodGhpcy5rZXljaGFybS5iaW5kKCJ1cCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdygiX21vdmVVcCIpfSwia2V5ZG93biIpLHRoaXMua2V5Y2hhcm0uYmluZCgiZG93biIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdygiX21vdmVEb3duIil9LCJrZXlkb3duIiksdGhpcy5rZXljaGFybS5iaW5kKCJsZWZ0IixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KCJfbW92ZUxlZnQiKX0sImtleWRvd24iKSx0aGlzLmtleWNoYXJtLmJpbmQoInJpZ2h0IixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KCJfbW92ZVJpZ2h0Iil9LCJrZXlkb3duIiksdGhpcy5rZXljaGFybS5iaW5kKCI9IixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KCJfem9vbUluIil9LCJrZXlkb3duIiksdGhpcy5rZXljaGFybS5iaW5kKCJudW0rIixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KCJfem9vbUluIil9LCJrZXlkb3duIiksdGhpcy5rZXljaGFybS5iaW5kKCJudW0tIixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KCJfem9vbU91dCIpfSwia2V5ZG93biIpLHRoaXMua2V5Y2hhcm0uYmluZCgiLSIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdygiX3pvb21PdXQiKX0sImtleWRvd24iKSx0aGlzLmtleWNoYXJtLmJpbmQoIlsiLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoIl96b29tT3V0Iil9LCJrZXlkb3duIiksdGhpcy5rZXljaGFybS5iaW5kKCJdIixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KCJfem9vbUluIil9LCJrZXlkb3duIiksdGhpcy5rZXljaGFybS5iaW5kKCJwYWdldXAiLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoIl96b29tSW4iKX0sImtleWRvd24iKSx0aGlzLmtleWNoYXJtLmJpbmQoInBhZ2Vkb3duIixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KCJfem9vbU91dCIpfSwia2V5ZG93biIpLHRoaXMua2V5Y2hhcm0uYmluZCgidXAiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KCJfbW92ZVVwIil9LCJrZXl1cCIpLHRoaXMua2V5Y2hhcm0uYmluZCgiZG93biIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoIl9tb3ZlRG93biIpfSwia2V5dXAiKSx0aGlzLmtleWNoYXJtLmJpbmQoImxlZnQiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KCJfbW92ZUxlZnQiKX0sImtleXVwIiksdGhpcy5rZXljaGFybS5iaW5kKCJyaWdodCIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoIl9tb3ZlUmlnaHQiKX0sImtleXVwIiksdGhpcy5rZXljaGFybS5iaW5kKCI9IixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdygiX3pvb21JbiIpfSwia2V5dXAiKSx0aGlzLmtleWNoYXJtLmJpbmQoIm51bSsiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KCJfem9vbUluIil9LCJrZXl1cCIpLHRoaXMua2V5Y2hhcm0uYmluZCgibnVtLSIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoIl96b29tT3V0Iil9LCJrZXl1cCIpLHRoaXMua2V5Y2hhcm0uYmluZCgiLSIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoIl96b29tT3V0Iil9LCJrZXl1cCIpLHRoaXMua2V5Y2hhcm0uYmluZCgiWyIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoIl96b29tT3V0Iil9LCJrZXl1cCIpLHRoaXMua2V5Y2hhcm0uYmluZCgiXSIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoIl96b29tSW4iKX0sImtleXVwIiksdGhpcy5rZXljaGFybS5iaW5kKCJwYWdldXAiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KCJfem9vbUluIil9LCJrZXl1cCIpLHRoaXMua2V5Y2hhcm0uYmluZCgicGFnZWRvd24iLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KCJfem9vbU91dCIpfSwia2V5dXAiKSkpfX1dKSx0fSgpO2UuZGVmYXVsdD11fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTM0KSxzPW8obikscj1pKDEzNSksYT1vKHIpLGg9aSgxNjgpLmRlZmF1bHQsZD1pKDIwMSkuZGVmYXVsdCxsPWkoMSksdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpKXt2YXIgbz10aGlzOygwLHMuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLmNhbnZhcz1pLHRoaXMuc2VsZWN0aW9uT2JqPXtub2RlczpbXSxlZGdlczpbXX0sdGhpcy5ob3Zlck9iaj17bm9kZXM6e30sZWRnZXM6e319LHRoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXttdWx0aXNlbGVjdDohMSxzZWxlY3RhYmxlOiEwLHNlbGVjdENvbm5lY3RlZEVkZ2VzOiEwLGhvdmVyQ29ubmVjdGVkRWRnZXM6ITB9LGwuZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX2RhdGFDaGFuZ2VkIixmdW5jdGlvbigpe28udXBkYXRlU2VsZWN0aW9uKCl9KX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3ZhciBlPVsibXVsdGlzZWxlY3QiLCJob3ZlckNvbm5lY3RlZEVkZ2VzIiwic2VsZWN0YWJsZSIsInNlbGVjdENvbm5lY3RlZEVkZ2VzIl07bC5zZWxlY3RpdmVEZWVwRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpfX19LHtrZXk6InNlbGVjdE9uUG9pbnQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSExO2lmKCEwPT09dGhpcy5vcHRpb25zLnNlbGVjdGFibGUpe3ZhciBpPXRoaXMuZ2V0Tm9kZUF0KHQpfHx0aGlzLmdldEVkZ2VBdCh0KTt0aGlzLnVuc2VsZWN0QWxsKCksdm9pZCAwIT09aSYmKGU9dGhpcy5zZWxlY3RPYmplY3QoaSkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXF1ZXN0UmVkcmF3Iil9cmV0dXJuIGV9fSx7a2V5OiJzZWxlY3RBZGRpdGlvbmFsT25Qb2ludCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9ITE7aWYoITA9PT10aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSl7dmFyIGk9dGhpcy5nZXROb2RlQXQodCl8fHRoaXMuZ2V0RWRnZUF0KHQpO3ZvaWQgMCE9PWkmJihlPSEwLCEwPT09aS5pc1NlbGVjdGVkKCk/dGhpcy5kZXNlbGVjdE9iamVjdChpKTp0aGlzLnNlbGVjdE9iamVjdChpKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfcmVxdWVzdFJlZHJhdyIpKX1yZXR1cm4gZX19LHtrZXk6Il9nZW5lcmF0ZUNsaWNrRXZlbnQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdJiZhcmd1bWVudHNbNF0scz12b2lkIDA7cz0hMD09PW4/e25vZGVzOltdLGVkZ2VzOltdfTp0aGlzLmdldFNlbGVjdGlvbigpLHMucG9pbnRlcj17RE9NOnt4OmkueCx5OmkueX0sY2FudmFzOnRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKGkpfSxzLmV2ZW50PWUsdm9pZCAwIT09byYmKHMucHJldmlvdXNTZWxlY3Rpb249byksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCh0LHMpfX0se2tleToic2VsZWN0T2JqZWN0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5vcHRpb25zLnNlbGVjdENvbm5lY3RlZEVkZ2VzO3JldHVybiB2b2lkIDAhPT10JiYodCBpbnN0YW5jZW9mIGgmJiEwPT09ZSYmdGhpcy5fc2VsZWN0Q29ubmVjdGVkRWRnZXModCksdC5zZWxlY3QoKSx0aGlzLl9hZGRUb1NlbGVjdGlvbih0KSwhMCl9fSx7a2V5OiJkZXNlbGVjdE9iamVjdCIsdmFsdWU6ZnVuY3Rpb24odCl7ITA9PT10LmlzU2VsZWN0ZWQoKSYmKHQuc2VsZWN0ZWQ9ITEsdGhpcy5fcmVtb3ZlRnJvbVNlbGVjdGlvbih0KSl9fSx7a2V5OiJfZ2V0QWxsTm9kZXNPdmVybGFwcGluZ1dpdGgiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPXRoaXMuYm9keS5ub2RlcyxvPTA7bzx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO28rKyl7dmFyIG49dGhpcy5ib2R5Lm5vZGVJbmRpY2VzW29dO2lbbl0uaXNPdmVybGFwcGluZ1dpdGgodCkmJmUucHVzaChuKX1yZXR1cm4gZX19LHtrZXk6Il9wb2ludGVyVG9Qb3NpdGlvbk9iamVjdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jYW52YXMuRE9NdG9DYW52YXModCk7cmV0dXJue2xlZnQ6ZS54LTEsdG9wOmUueSsxLHJpZ2h0OmUueCsxLGJvdHRvbTplLnktMX19fSx7a2V5OiJnZXROb2RlQXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV0saT10aGlzLl9wb2ludGVyVG9Qb3NpdGlvbk9iamVjdCh0KSxvPXRoaXMuX2dldEFsbE5vZGVzT3ZlcmxhcHBpbmdXaXRoKGkpO3JldHVybiBvLmxlbmd0aD4wPyEwPT09ZT90aGlzLmJvZHkubm9kZXNbb1tvLmxlbmd0aC0xXV06b1tvLmxlbmd0aC0xXTp2b2lkIDB9fSx7a2V5OiJfZ2V0RWRnZXNPdmVybGFwcGluZ1dpdGgiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMuYm9keS5lZGdlcyxvPTA7bzx0aGlzLmJvZHkuZWRnZUluZGljZXMubGVuZ3RoO28rKyl7dmFyIG49dGhpcy5ib2R5LmVkZ2VJbmRpY2VzW29dO2lbbl0uaXNPdmVybGFwcGluZ1dpdGgodCkmJmUucHVzaChuKX19fSx7a2V5OiJfZ2V0QWxsRWRnZXNPdmVybGFwcGluZ1dpdGgiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0aGlzLl9nZXRFZGdlc092ZXJsYXBwaW5nV2l0aCh0LGUpLGV9fSx7a2V5OiJnZXRFZGdlQXQiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdLGk9dGhpcy5jYW52YXMuRE9NdG9DYW52YXModCksbz0xMCxuPW51bGwscz10aGlzLmJvZHkuZWRnZXMscj0wO3I8dGhpcy5ib2R5LmVkZ2VJbmRpY2VzLmxlbmd0aDtyKyspe3ZhciBhPXRoaXMuYm9keS5lZGdlSW5kaWNlc1tyXSxoPXNbYV07aWYoaC5jb25uZWN0ZWQpe3ZhciBkPWguZnJvbS54LGw9aC5mcm9tLnksdT1oLnRvLngsYz1oLnRvLnkscD1oLmVkZ2VUeXBlLmdldERpc3RhbmNlVG9FZGdlKGQsbCx1LGMsaS54LGkueSk7cDxvJiYobj1hLG89cCl9fXJldHVybiBudWxsIT09bj8hMD09PWU/dGhpcy5ib2R5LmVkZ2VzW25dOm46dm9pZCAwfX0se2tleToiX2FkZFRvU2VsZWN0aW9uIix2YWx1ZTpmdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgaD90aGlzLnNlbGVjdGlvbk9iai5ub2Rlc1t0LmlkXT10OnRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzW3QuaWRdPXR9fSx7a2V5OiJfYWRkVG9Ib3ZlciIsdmFsdWU6ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIGg/dGhpcy5ob3Zlck9iai5ub2Rlc1t0LmlkXT10OnRoaXMuaG92ZXJPYmouZWRnZXNbdC5pZF09dH19LHtrZXk6Il9yZW1vdmVGcm9tU2VsZWN0aW9uIix2YWx1ZTpmdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgaD8oZGVsZXRlIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzW3QuaWRdLHRoaXMuX3Vuc2VsZWN0Q29ubmVjdGVkRWRnZXModCkpOmRlbGV0ZSB0aGlzLnNlbGVjdGlvbk9iai5lZGdlc1t0LmlkXX19LHtrZXk6InVuc2VsZWN0QWxsIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eSh0KSYmdGhpcy5zZWxlY3Rpb25PYmoubm9kZXNbdF0udW5zZWxlY3QoKTtmb3IodmFyIGUgaW4gdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMpdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMuaGFzT3duUHJvcGVydHkoZSkmJnRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzW2VdLnVuc2VsZWN0KCk7dGhpcy5zZWxlY3Rpb25PYmo9e25vZGVzOnt9LGVkZ2VzOnt9fX19LHtrZXk6Il9nZXRTZWxlY3RlZE5vZGVDb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmKHQrPTEpO3JldHVybiB0fX0se2tleToiX2dldFNlbGVjdGVkTm9kZSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMpaWYodGhpcy5zZWxlY3Rpb25PYmoubm9kZXMuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzW3RdfX0se2tleToiX2dldFNlbGVjdGVkRWRnZSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMpaWYodGhpcy5zZWxlY3Rpb25PYmouZWRnZXMuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzW3RdfX0se2tleToiX2dldFNlbGVjdGVkRWRnZUNvdW50Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKXRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KGUpJiYodCs9MSk7cmV0dXJuIHR9fSx7a2V5OiJfZ2V0U2VsZWN0ZWRPYmplY3RDb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmKHQrPTEpO2Zvcih2YXIgaSBpbiB0aGlzLnNlbGVjdGlvbk9iai5lZGdlcyl0aGlzLnNlbGVjdGlvbk9iai5lZGdlcy5oYXNPd25Qcm9wZXJ0eShpKSYmKHQrPTEpO3JldHVybiB0fX0se2tleToiX3NlbGVjdGlvbklzRW1wdHkiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzKWlmKHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzLmhhc093blByb3BlcnR5KHQpKXJldHVybiExO2Zvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5lZGdlcylpZih0aGlzLnNlbGVjdGlvbk9iai5lZGdlcy5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4hMTtyZXR1cm4hMH19LHtrZXk6Il9jbHVzdGVySW5TZWxlY3Rpb24iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzKWlmKHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzLmhhc093blByb3BlcnR5KHQpJiZ0aGlzLnNlbGVjdGlvbk9iai5ub2Rlc1t0XS5jbHVzdGVyU2l6ZT4xKXJldHVybiEwO3JldHVybiExfX0se2tleToiX3NlbGVjdENvbm5lY3RlZEVkZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuZWRnZXMubGVuZ3RoO2UrKyl7dmFyIGk9dC5lZGdlc1tlXTtpLnNlbGVjdCgpLHRoaXMuX2FkZFRvU2VsZWN0aW9uKGkpfX19LHtrZXk6Il9ob3ZlckNvbm5lY3RlZEVkZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuZWRnZXMubGVuZ3RoO2UrKyl7dmFyIGk9dC5lZGdlc1tlXTtpLmhvdmVyPSEwLHRoaXMuX2FkZFRvSG92ZXIoaSl9fX0se2tleToiX3Vuc2VsZWN0Q29ubmVjdGVkRWRnZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5lZGdlcy5sZW5ndGg7ZSsrKXt2YXIgaT10LmVkZ2VzW2VdO2kudW5zZWxlY3QoKSx0aGlzLl9yZW1vdmVGcm9tU2VsZWN0aW9uKGkpfX19LHtrZXk6ImJsdXJPYmplY3QiLHZhbHVlOmZ1bmN0aW9uKHQpeyEwPT09dC5ob3ZlciYmKHQuaG92ZXI9ITEsdCBpbnN0YW5jZW9mIGg/dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiYmx1ck5vZGUiLHtub2RlOnQuaWR9KTp0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJibHVyRWRnZSIse2VkZ2U6dC5pZH0pKX19LHtrZXk6ImhvdmVyT2JqZWN0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0hMTtmb3IodmFyIGkgaW4gdGhpcy5ob3Zlck9iai5ub2Rlcyl0aGlzLmhvdmVyT2JqLm5vZGVzLmhhc093blByb3BlcnR5KGkpJiYodm9pZCAwPT09dHx8dCBpbnN0YW5jZW9mIGgmJnQuaWQhPWl8fHQgaW5zdGFuY2VvZiBkKSYmKHRoaXMuYmx1ck9iamVjdCh0aGlzLmhvdmVyT2JqLm5vZGVzW2ldKSxkZWxldGUgdGhpcy5ob3Zlck9iai5ub2Rlc1tpXSxlPSEwKTtmb3IodmFyIG8gaW4gdGhpcy5ob3Zlck9iai5lZGdlcyl0aGlzLmhvdmVyT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KG8pJiYoITA9PT1lPyh0aGlzLmhvdmVyT2JqLmVkZ2VzW29dLmhvdmVyPSExLGRlbGV0ZSB0aGlzLmhvdmVyT2JqLmVkZ2VzW29dKToodm9pZCAwPT09dHx8dCBpbnN0YW5jZW9mIGQmJnQuaWQhPW98fHQgaW5zdGFuY2VvZiBoJiYhdC5ob3ZlcikmJih0aGlzLmJsdXJPYmplY3QodGhpcy5ob3Zlck9iai5lZGdlc1tvXSksZGVsZXRlIHRoaXMuaG92ZXJPYmouZWRnZXNbb10sZT0hMCkpO3ZvaWQgMCE9PXQmJighMT09PXQuaG92ZXImJih0LmhvdmVyPSEwLHRoaXMuX2FkZFRvSG92ZXIodCksZT0hMCx0IGluc3RhbmNlb2YgaD90aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJob3Zlck5vZGUiLHtub2RlOnQuaWR9KTp0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJob3ZlckVkZ2UiLHtlZGdlOnQuaWR9KSksdCBpbnN0YW5jZW9mIGgmJiEwPT09dGhpcy5vcHRpb25zLmhvdmVyQ29ubmVjdGVkRWRnZXMmJnRoaXMuX2hvdmVyQ29ubmVjdGVkRWRnZXModCkpLCEwPT09ZSYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlcXVlc3RSZWRyYXciKX19LHtrZXk6ImdldFNlbGVjdGlvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57bm9kZXM6dGhpcy5nZXRTZWxlY3RlZE5vZGVzKCksZWRnZXM6dGhpcy5nZXRTZWxlY3RlZEVkZ2VzKCl9fX0se2tleToiZ2V0U2VsZWN0ZWROb2RlcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1bXTtpZighMD09PXRoaXMub3B0aW9ucy5zZWxlY3RhYmxlKWZvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmdC5wdXNoKHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzW2VdLmlkKTtyZXR1cm4gdH19LHtrZXk6ImdldFNlbGVjdGVkRWRnZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9W107aWYoITA9PT10aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSlmb3IodmFyIGUgaW4gdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMpdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMuaGFzT3duUHJvcGVydHkoZSkmJnQucHVzaCh0aGlzLnNlbGVjdGlvbk9iai5lZGdlc1tlXS5pZCk7cmV0dXJuIHR9fSx7a2V5OiJzZXRTZWxlY3Rpb24iLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxpPXZvaWQgMCxvPXZvaWQgMDtpZighdHx8IXQubm9kZXMmJiF0LmVkZ2VzKXRocm93IlNlbGVjdGlvbiBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIG5vZGVzIGFuZC9vciBlZGdlcyBwcm9wZXJ0aWVzIjtpZigoZS51bnNlbGVjdEFsbHx8dm9pZCAwPT09ZS51bnNlbGVjdEFsbCkmJnRoaXMudW5zZWxlY3RBbGwoKSx0Lm5vZGVzKWZvcihpPTA7aTx0Lm5vZGVzLmxlbmd0aDtpKyspe289dC5ub2Rlc1tpXTt2YXIgbj10aGlzLmJvZHkubm9kZXNbb107aWYoIW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ05vZGUgd2l0aCBpZCAiJytvKyciIG5vdCBmb3VuZCcpO3RoaXMuc2VsZWN0T2JqZWN0KG4sZS5oaWdobGlnaHRFZGdlcyl9aWYodC5lZGdlcylmb3IoaT0wO2k8dC5lZGdlcy5sZW5ndGg7aSsrKXtvPXQuZWRnZXNbaV07dmFyIHM9dGhpcy5ib2R5LmVkZ2VzW29dO2lmKCFzKXRocm93IG5ldyBSYW5nZUVycm9yKCdFZGdlIHdpdGggaWQgIicrbysnIiBub3QgZm91bmQnKTt0aGlzLnNlbGVjdE9iamVjdChzKX10aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfcmVxdWVzdFJlZHJhdyIpfX0se2tleToic2VsZWN0Tm9kZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07aWYoIXR8fHZvaWQgMD09PXQubGVuZ3RoKXRocm93IlNlbGVjdGlvbiBtdXN0IGJlIGFuIGFycmF5IHdpdGggaWRzIjt0aGlzLnNldFNlbGVjdGlvbih7bm9kZXM6dH0se2hpZ2hsaWdodEVkZ2VzOmV9KX19LHtrZXk6InNlbGVjdEVkZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dm9pZCAwPT09dC5sZW5ndGgpdGhyb3ciU2VsZWN0aW9uIG11c3QgYmUgYW4gYXJyYXkgd2l0aCBpZHMiO3RoaXMuc2V0U2VsZWN0aW9uKHtlZGdlczp0fSl9fSx7a2V5OiJ1cGRhdGVTZWxlY3Rpb24iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzKXRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzLmhhc093blByb3BlcnR5KHQpJiYodGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KHQpfHxkZWxldGUgdGhpcy5zZWxlY3Rpb25PYmoubm9kZXNbdF0pO2Zvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5lZGdlcyl0aGlzLnNlbGVjdGlvbk9iai5lZGdlcy5oYXNPd25Qcm9wZXJ0eShlKSYmKHRoaXMuYm9keS5lZGdlcy5oYXNPd25Qcm9wZXJ0eShlKXx8ZGVsZXRlIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzW2VdKX19XSksdH0oKTtlLmRlZmF1bHQ9dX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDU4KSxzPW8obikscj1pKDE3MCksYT1vKHIpLGg9aSg2MiksZD1vKGgpLGw9aSgxMzQpLHU9byhsKSxjPWkoMTM1KSxwPW8oYyksZj1pKDEpLG09aSgyMTkpLmRlZmF1bHQsdj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCx1LmRlZmF1bHQpKHRoaXMsdCksdGhpcy5jaGlsZHJlblJlZmVyZW5jZT17fSx0aGlzLnBhcmVudFJlZmVyZW5jZT17fSx0aGlzLmxldmVscz17fSx0aGlzLnRyZWVzPXt9LHRoaXMuaXNUcmVlPSExfXJldHVybigwLHAuZGVmYXVsdCkodCxbe2tleToiYWRkUmVsYXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09dGhpcy5jaGlsZHJlblJlZmVyZW5jZVt0XSYmKHRoaXMuY2hpbGRyZW5SZWZlcmVuY2VbdF09W10pLHRoaXMuY2hpbGRyZW5SZWZlcmVuY2VbdF0ucHVzaChlKSx2b2lkIDA9PT10aGlzLnBhcmVudFJlZmVyZW5jZVtlXSYmKHRoaXMucGFyZW50UmVmZXJlbmNlW2VdPVtdKSx0aGlzLnBhcmVudFJlZmVyZW5jZVtlXS5wdXNoKHQpfX0se2tleToiY2hlY2tJZlRyZWUiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMucGFyZW50UmVmZXJlbmNlKWlmKHRoaXMucGFyZW50UmVmZXJlbmNlW3RdLmxlbmd0aD4xKXJldHVybiB2b2lkKHRoaXMuaXNUcmVlPSExKTt0aGlzLmlzVHJlZT0hMH19LHtrZXk6ImVuc3VyZUxldmVsIix2YWx1ZTpmdW5jdGlvbih0KXt2b2lkIDA9PT10aGlzLmxldmVsc1t0XSYmKHRoaXMubGV2ZWxzW3RdPTApfX0se2tleToiZ2V0TWF4TGV2ZWwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsaT17fTtyZXR1cm4gZnVuY3Rpb24gdChvKXtpZih2b2lkIDAhPT1pW29dKXJldHVybiBpW29dO3ZhciBuPWUubGV2ZWxzW29dO2lmKGUuY2hpbGRyZW5SZWZlcmVuY2Vbb10pe3ZhciBzPWUuY2hpbGRyZW5SZWZlcmVuY2Vbb10KO2lmKHMubGVuZ3RoPjApZm9yKHZhciByPTA7cjxzLmxlbmd0aDtyKyspbj1NYXRoLm1heChuLHQoc1tyXSkpfXJldHVybiBpW29dPW4sbn0odCl9fSx7a2V5OiJsZXZlbERvd25zdHJlYW0iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09dGhpcy5sZXZlbHNbZS5pZF0mJih2b2lkIDA9PT10aGlzLmxldmVsc1t0LmlkXSYmKHRoaXMubGV2ZWxzW3QuaWRdPTApLHRoaXMubGV2ZWxzW2UuaWRdPXRoaXMubGV2ZWxzW3QuaWRdKzEpfX0se2tleToic2V0TWluTGV2ZWxUb1plcm8iLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPTFlOTtmb3IodmFyIGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiZ2b2lkIDAhPT10aGlzLmxldmVsc1tpXSYmKGU9TWF0aC5taW4odGhpcy5sZXZlbHNbaV0sZSkpO2Zvcih2YXIgbyBpbiB0KXQuaGFzT3duUHJvcGVydHkobykmJnZvaWQgMCE9PXRoaXMubGV2ZWxzW29dJiYodGhpcy5sZXZlbHNbb10tPWUpfX0se2tleToiZ2V0VHJlZVNpemUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9MWU5LG89LTFlOSxuPTFlOSxzPS0xZTk7Zm9yKHZhciByIGluIHRoaXMudHJlZXMpaWYodGhpcy50cmVlcy5oYXNPd25Qcm9wZXJ0eShyKSYmdGhpcy50cmVlc1tyXT09PWUpe3ZhciBhPXRbcl07aT1NYXRoLm1pbihhLngsaSksbz1NYXRoLm1heChhLngsbyksbj1NYXRoLm1pbihhLnksbikscz1NYXRoLm1heChhLnkscyl9cmV0dXJue21pbl94OmksbWF4X3g6byxtaW5feTpuLG1heF95OnN9fX1dKSx0fSgpLGc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpeygwLHUuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLmluaXRpYWxSYW5kb21TZWVkPU1hdGgucm91bmQoMWU2Kk1hdGgucmFuZG9tKCkpLHRoaXMucmFuZG9tU2VlZD10aGlzLmluaXRpYWxSYW5kb21TZWVkLHRoaXMuc2V0UGh5c2ljcz0hMSx0aGlzLm9wdGlvbnM9e30sdGhpcy5vcHRpb25zQmFja3VwPXtwaHlzaWNzOnt9fSx0aGlzLmRlZmF1bHRPcHRpb25zPXtyYW5kb21TZWVkOnZvaWQgMCxpbXByb3ZlZExheW91dDohMCxoaWVyYXJjaGljYWw6e2VuYWJsZWQ6ITEsbGV2ZWxTZXBhcmF0aW9uOjE1MCxub2RlU3BhY2luZzoxMDAsdHJlZVNwYWNpbmc6MjAwLGJsb2NrU2hpZnRpbmc6ITAsZWRnZU1pbmltaXphdGlvbjohMCxwYXJlbnRDZW50cmFsaXphdGlvbjohMCxkaXJlY3Rpb246IlVEIixzb3J0TWV0aG9kOiJodWJzaXplIn19LGYuZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmJpbmRFdmVudExpc3RlbmVycygpfXJldHVybigwLHAuZGVmYXVsdCkodCxbe2tleToiYmluZEV2ZW50TGlzdGVuZXJzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub24oIl9kYXRhQ2hhbmdlZCIsZnVuY3Rpb24oKXt0LnNldHVwSGllcmFyY2hpY2FsTGF5b3V0KCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX2RhdGFMb2FkZWQiLGZ1bmN0aW9uKCl7dC5sYXlvdXROZXR3b3JrKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX3Jlc2V0SGllcmFyY2hpY2FsTGF5b3V0IixmdW5jdGlvbigpe3Quc2V0dXBIaWVyYXJjaGljYWxMYXlvdXQoKX0pfX0se2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT10KXt2YXIgaT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQ7aWYoZi5zZWxlY3RpdmVEZWVwRXh0ZW5kKFsicmFuZG9tU2VlZCIsImltcHJvdmVkTGF5b3V0Il0sdGhpcy5vcHRpb25zLHQpLGYubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LCJoaWVyYXJjaGljYWwiKSx2b2lkIDAhPT10LnJhbmRvbVNlZWQmJih0aGlzLmluaXRpYWxSYW5kb21TZWVkPXQucmFuZG9tU2VlZCksITA9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQpcmV0dXJuITA9PT1pJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJyZWZyZXNoIiwhMCksIlJMIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9ufHwiRFUiPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5kaXJlY3Rpb24/dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5sZXZlbFNlcGFyYXRpb24+MCYmKHRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubGV2ZWxTZXBhcmF0aW9uKj0tMSk6dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5sZXZlbFNlcGFyYXRpb248MCYmKHRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubGV2ZWxTZXBhcmF0aW9uKj0tMSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3Jlc2V0SGllcmFyY2hpY2FsTGF5b3V0IiksdGhpcy5hZGFwdEFsbE9wdGlvbnNGb3JIaWVyYXJjaGljYWxMYXlvdXQoZSk7aWYoITA9PT1pKXJldHVybiB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJyZWZyZXNoIiksZi5kZWVwRXh0ZW5kKGUsdGhpcy5vcHRpb25zQmFja3VwKX1yZXR1cm4gZX19LHtrZXk6ImFkYXB0QWxsT3B0aW9uc0ZvckhpZXJhcmNoaWNhbExheW91dCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoITA9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQpe3ZvaWQgMD09PXQucGh5c2ljc3x8ITA9PT10LnBoeXNpY3M/KHQucGh5c2ljcz17ZW5hYmxlZDp2b2lkIDA9PT10aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljcy5lbmFibGVkfHx0aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljcy5lbmFibGVkLHNvbHZlcjoiaGllcmFyY2hpY2FsUmVwdWxzaW9uIn0sdGhpcy5vcHRpb25zQmFja3VwLnBoeXNpY3MuZW5hYmxlZD12b2lkIDA9PT10aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljcy5lbmFibGVkfHx0aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljcy5lbmFibGVkLHRoaXMub3B0aW9uc0JhY2t1cC5waHlzaWNzLnNvbHZlcj10aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljcy5zb2x2ZXJ8fCJiYXJuZXNIdXQiKToib2JqZWN0Ij09PSgwLGQuZGVmYXVsdCkodC5waHlzaWNzKT8odGhpcy5vcHRpb25zQmFja3VwLnBoeXNpY3MuZW5hYmxlZD12b2lkIDA9PT10LnBoeXNpY3MuZW5hYmxlZHx8dC5waHlzaWNzLmVuYWJsZWQsdGhpcy5vcHRpb25zQmFja3VwLnBoeXNpY3Muc29sdmVyPXQucGh5c2ljcy5zb2x2ZXJ8fCJiYXJuZXNIdXQiLHQucGh5c2ljcy5zb2x2ZXI9ImhpZXJhcmNoaWNhbFJlcHVsc2lvbiIpOiExIT09dC5waHlzaWNzJiYodGhpcy5vcHRpb25zQmFja3VwLnBoeXNpY3Muc29sdmVyPSJiYXJuZXNIdXQiLHQucGh5c2ljcz17c29sdmVyOiJoaWVyYXJjaGljYWxSZXB1bHNpb24ifSk7dmFyIGU9Imhvcml6b250YWwiOyJSTCIhPT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbiYmIkxSIiE9PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9ufHwoZT0idmVydGljYWwiKSx2b2lkIDA9PT10LmVkZ2VzPyh0aGlzLm9wdGlvbnNCYWNrdXAuZWRnZXM9e3Ntb290aDp7ZW5hYmxlZDohMCx0eXBlOiJkeW5hbWljIn19LHQuZWRnZXM9e3Ntb290aDohMX0pOnZvaWQgMD09PXQuZWRnZXMuc21vb3RoPyh0aGlzLm9wdGlvbnNCYWNrdXAuZWRnZXM9e3Ntb290aDp7ZW5hYmxlZDohMCx0eXBlOiJkeW5hbWljIn19LHQuZWRnZXMuc21vb3RoPSExKToiYm9vbGVhbiI9PXR5cGVvZiB0LmVkZ2VzLnNtb290aD8odGhpcy5vcHRpb25zQmFja3VwLmVkZ2VzPXtzbW9vdGg6dC5lZGdlcy5zbW9vdGh9LHQuZWRnZXMuc21vb3RoPXtlbmFibGVkOnQuZWRnZXMuc21vb3RoLHR5cGU6ZX0pOih2b2lkIDAhPT10LmVkZ2VzLnNtb290aC50eXBlJiYiZHluYW1pYyIhPT10LmVkZ2VzLnNtb290aC50eXBlJiYoZT10LmVkZ2VzLnNtb290aC50eXBlKSx0aGlzLm9wdGlvbnNCYWNrdXAuZWRnZXM9e3Ntb290aDp2b2lkIDA9PT10LmVkZ2VzLnNtb290aC5lbmFibGVkfHx0LmVkZ2VzLnNtb290aC5lbmFibGVkLHR5cGU6dm9pZCAwPT09dC5lZGdlcy5zbW9vdGgudHlwZT8iZHluYW1pYyI6dC5lZGdlcy5zbW9vdGgudHlwZSxyb3VuZG5lc3M6dm9pZCAwPT09dC5lZGdlcy5zbW9vdGgucm91bmRuZXNzPy41OnQuZWRnZXMuc21vb3RoLnJvdW5kbmVzcyxmb3JjZURpcmVjdGlvbjp2b2lkIDAhPT10LmVkZ2VzLnNtb290aC5mb3JjZURpcmVjdGlvbiYmdC5lZGdlcy5zbW9vdGguZm9yY2VEaXJlY3Rpb259LHQuZWRnZXMuc21vb3RoPXtlbmFibGVkOnZvaWQgMD09PXQuZWRnZXMuc21vb3RoLmVuYWJsZWR8fHQuZWRnZXMuc21vb3RoLmVuYWJsZWQsdHlwZTplLHJvdW5kbmVzczp2b2lkIDA9PT10LmVkZ2VzLnNtb290aC5yb3VuZG5lc3M/LjU6dC5lZGdlcy5zbW9vdGgucm91bmRuZXNzLGZvcmNlRGlyZWN0aW9uOnZvaWQgMCE9PXQuZWRnZXMuc21vb3RoLmZvcmNlRGlyZWN0aW9uJiZ0LmVkZ2VzLnNtb290aC5mb3JjZURpcmVjdGlvbn0pLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9mb3JjZURpc2FibGVEeW5hbWljQ3VydmVzIixlKX1yZXR1cm4gdH19LHtrZXk6InNlZWRlZFJhbmRvbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0xZTQqTWF0aC5zaW4odGhpcy5yYW5kb21TZWVkKyspO3JldHVybiB0LU1hdGguZmxvb3IodCl9fSx7a2V5OiJwb3NpdGlvbkluaXRpYWxseSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoITAhPT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQpe3RoaXMucmFuZG9tU2VlZD10aGlzLmluaXRpYWxSYW5kb21TZWVkO2Zvcih2YXIgZT10Lmxlbmd0aCs1MCxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBvPXRbaV0sbj0yKk1hdGguUEkqdGhpcy5zZWVkZWRSYW5kb20oKTt2b2lkIDA9PT1vLngmJihvLng9ZSpNYXRoLmNvcyhuKSksdm9pZCAwPT09by55JiYoby55PWUqTWF0aC5zaW4obikpfX19fSx7a2V5OiJsYXlvdXROZXR3b3JrIix2YWx1ZTpmdW5jdGlvbigpe2lmKCEwIT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5lbmFibGVkJiYhMD09PXRoaXMub3B0aW9ucy5pbXByb3ZlZExheW91dCl7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtlKyspeyEwPT09dGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tlXV0ucHJlZGVmaW5lZFBvc2l0aW9uJiYodCs9MSl9aWYodDwuNSp0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoKXt2YXIgaT0wLG89e2NsdXN0ZXJFZGdlUHJvcGVydGllczp7c21vb3RoOntlbmFibGVkOiExfX19O2lmKHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg+MTUwKXtmb3IodmFyIG49dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDt0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoPjE1MCYmaTw9MTA7KXtpKz0xO3ZhciBzPXRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7aSUzPT0wP3RoaXMuYm9keS5tb2R1bGVzLmNsdXN0ZXJpbmcuY2x1c3RlckJyaWRnZXMobyk6dGhpcy5ib2R5Lm1vZHVsZXMuY2x1c3RlcmluZy5jbHVzdGVyT3V0bGllcnMobyk7aWYocz09dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aCYmaSUzIT0wKXJldHVybiB0aGlzLl9kZWNsdXN0ZXJBbGwoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfbGF5b3V0RmFpbGVkIiksdm9pZCBjb25zb2xlLmluZm8oIlRoaXMgbmV0d29yayBjb3VsZCBub3QgYmUgcG9zaXRpb25lZCBieSB0aGlzIHZlcnNpb24gb2YgdGhlIGltcHJvdmVkIGxheW91dCBhbGdvcml0aG0uIFBsZWFzZSBkaXNhYmxlIGltcHJvdmVkTGF5b3V0IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuIil9dGhpcy5ib2R5Lm1vZHVsZXMua2FtYWRhS2F3YWkuc2V0T3B0aW9ucyh7c3ByaW5nTGVuZ3RoOk1hdGgubWF4KDE1MCwyKm4pfSl9aT4xMCYmY29uc29sZS5pbmZvKCJUaGUgY2x1c3RlcmluZyBkaWRuJ3Qgc3VjY2VlZCB3aXRoaW4gdGhlIGFtb3VudCBvZiBpbnRlcmF0aW9ucyBhbGxvd2VkLCBwcm9ncmVzc2luZyB3aXRoIHBhcnRpYWwgcmVzdWx0LiIpLHRoaXMuYm9keS5tb2R1bGVzLmthbWFkYUthd2FpLnNvbHZlKHRoaXMuYm9keS5ub2RlSW5kaWNlcyx0aGlzLmJvZHkuZWRnZUluZGljZXMsITApLHRoaXMuX3NoaWZ0VG9DZW50ZXIoKTtmb3IodmFyIHI9MDtyPHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7cisrKSExPT09dGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tyXV0ucHJlZGVmaW5lZFBvc2l0aW9uJiYodGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tyXV0ueCs9NzAqKC41LXRoaXMuc2VlZGVkUmFuZG9tKCkpLHRoaXMuYm9keS5ub2Rlc1t0aGlzLmJvZHkubm9kZUluZGljZXNbcl1dLnkrPTcwKiguNS10aGlzLnNlZWRlZFJhbmRvbSgpKSk7dGhpcy5fZGVjbHVzdGVyQWxsKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlcG9zaXRpb25CZXppZXJOb2RlcyIpfX19fSx7a2V5OiJfc2hpZnRUb0NlbnRlciIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bS5nZXRSYW5nZUNvcmUodGhpcy5ib2R5Lm5vZGVzLHRoaXMuYm9keS5ub2RlSW5kaWNlcyksZT1tLmZpbmRDZW50ZXIodCksaT0wO2k8dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtpKyspdGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tpXV0ueC09ZS54LHRoaXMuYm9keS5ub2Rlc1t0aGlzLmJvZHkubm9kZUluZGljZXNbaV1dLnktPWUueX19LHtrZXk6Il9kZWNsdXN0ZXJBbGwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PSEwOyEwPT09dDspe3Q9ITE7Zm9yKHZhciBlPTA7ZTx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO2UrKykhMD09PXRoaXMuYm9keS5ub2Rlc1t0aGlzLmJvZHkubm9kZUluZGljZXNbZV1dLmlzQ2x1c3RlciYmKHQ9ITAsdGhpcy5ib2R5Lm1vZHVsZXMuY2x1c3RlcmluZy5vcGVuQ2x1c3Rlcih0aGlzLmJvZHkubm9kZUluZGljZXNbZV0se30sITEpKTshMD09PXQmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX19LHtrZXk6ImdldFNlZWQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5pdGlhbFJhbmRvbVNlZWR9fSx7a2V5OiJzZXR1cEhpZXJhcmNoaWNhbExheW91dCIsdmFsdWU6ZnVuY3Rpb24oKXtpZighMD09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZW5hYmxlZCYmdGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aD4wKXt2YXIgdD12b2lkIDAsZT12b2lkIDAsaT0hMSxvPSExO3RoaXMubGFzdE5vZGVPbkxldmVsPXt9LHRoaXMuaGllcmFyY2hpY2FsPW5ldyB2LHRoaXMudHJlZUluZGV4PS0xLHRoaXMuZGlzdHJpYnV0aW9uT3JkZXJpbmc9e30sdGhpcy5kaXN0cmlidXRpb25JbmRleD17fSx0aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nUHJlc2VuY2U9e307Zm9yKGUgaW4gdGhpcy5ib2R5Lm5vZGVzKXRoaXMuYm9keS5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmKHQ9dGhpcy5ib2R5Lm5vZGVzW2VdLHZvaWQgMD09PXQub3B0aW9ucy54JiZ2b2lkIDA9PT10Lm9wdGlvbnMueSYmITEsdm9pZCAwIT09dC5vcHRpb25zLmxldmVsPyhpPSEwLHRoaXMuaGllcmFyY2hpY2FsLmxldmVsc1tlXT10Lm9wdGlvbnMubGV2ZWwpOm89ITApO2lmKCEwPT09byYmITA9PT1pKXRocm93IG5ldyBFcnJvcigiVG8gdXNlIHRoZSBoaWVyYXJjaGljYWwgbGF5b3V0LCBub2RlcyByZXF1aXJlIGVpdGhlciBubyBwcmVkZWZpbmVkIGxldmVscyBvciBsZXZlbHMgaGF2ZSB0byBiZSBkZWZpbmVkIGZvciBhbGwgbm9kZXMuIik7ITA9PT1vJiYoImh1YnNpemUiPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5zb3J0TWV0aG9kP3RoaXMuX2RldGVybWluZUxldmVsc0J5SHVic2l6ZSgpOiJkaXJlY3RlZCI9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLnNvcnRNZXRob2Q/dGhpcy5fZGV0ZXJtaW5lTGV2ZWxzRGlyZWN0ZWQoKToiY3VzdG9tIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuc29ydE1ldGhvZCYmdGhpcy5fZGV0ZXJtaW5lTGV2ZWxzQ3VzdG9tQ2FsbGJhY2soKSk7Zm9yKHZhciBuIGluIHRoaXMuYm9keS5ub2Rlcyl0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkobikmJnRoaXMuaGllcmFyY2hpY2FsLmVuc3VyZUxldmVsKG4pO3ZhciBzPXRoaXMuX2dldERpc3RyaWJ1dGlvbigpO3RoaXMuX2dlbmVyYXRlTWFwKCksdGhpcy5fcGxhY2VOb2Rlc0J5SGllcmFyY2h5KHMpLHRoaXMuX2NvbmRlbnNlSGllcmFyY2h5KCksdGhpcy5fc2hpZnRUb0NlbnRlcigpfX19LHtrZXk6Il9jb25kZW5zZUhpZXJhcmNoeSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9ITEsaT17fSxvPWZ1bmN0aW9uKGUsaSl7Zm9yKHZhciBvIGluIHQuaGllcmFyY2hpY2FsLnRyZWVzKWlmKHQuaGllcmFyY2hpY2FsLnRyZWVzLmhhc093blByb3BlcnR5KG8pJiZ0LmhpZXJhcmNoaWNhbC50cmVlc1tvXT09PWUpe3ZhciBuPXQuYm9keS5ub2Rlc1tvXSxzPXQuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KG4pO3QuX3NldFBvc2l0aW9uRm9ySGllcmFyY2h5KG4scytpLHZvaWQgMCwhMCl9fSxuPWZ1bmN0aW9uKGUpe3ZhciBpPXQuaGllcmFyY2hpY2FsLmdldFRyZWVTaXplKHQuYm9keS5ub2RlcyxlKTtyZXR1cm4gdC5faXNWZXJ0aWNhbCgpP3ttaW46aS5taW5feCxtYXg6aS5tYXhfeH06e21pbjppLm1pbl95LG1heDppLm1heF95fX0scj1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSxpPTA7aTw9dC50cmVlSW5kZXg7aSsrKWUucHVzaChuKGkpKTtyZXR1cm4gZX0saD1mdW5jdGlvbiBlKGksbyl7aWYoIW9baS5pZF0mJihvW2kuaWRdPSEwLHQuaGllcmFyY2hpY2FsLmNoaWxkcmVuUmVmZXJlbmNlW2kuaWRdKSl7dmFyIG49dC5oaWVyYXJjaGljYWwuY2hpbGRyZW5SZWZlcmVuY2VbaS5pZF07aWYobi5sZW5ndGg+MClmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyllKHQuYm9keS5ub2Rlc1tuW3NdXSxvKX19LGQ9ZnVuY3Rpb24oZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjFlOSxvPTFlOSxuPTFlOSxzPTFlOSxyPS0xZTk7Zm9yKHZhciBoIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShoKSl7dmFyIGQ9dC5ib2R5Lm5vZGVzW2hdLGw9dC5oaWVyYXJjaGljYWwubGV2ZWxzW2QuaWRdLHU9dC5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkoZCksYz10Ll9nZXRTcGFjZUFyb3VuZE5vZGUoZCxlKSxwPSgwLGEuZGVmYXVsdCkoYywyKSxmPXBbMF0sbT1wWzFdO289TWF0aC5taW4oZixvKSxuPU1hdGgubWluKG0sbiksbDw9aSYmKHM9TWF0aC5taW4odSxzKSxyPU1hdGgubWF4KHUscikpfXJldHVybltzLHIsbyxuXX0sbD1mdW5jdGlvbihlLGkpe3ZhciBvPXQuaGllcmFyY2hpY2FsLmdldE1heExldmVsKGUuaWQpLG49dC5oaWVyYXJjaGljYWwuZ2V0TWF4TGV2ZWwoaS5pZCk7cmV0dXJuIE1hdGgubWluKG8sbil9LHU9ZnVuY3Rpb24oZSxpKXt2YXIgbz10LmhpZXJhcmNoaWNhbC5wYXJlbnRSZWZlcmVuY2VbZS5pZF0sbj10LmhpZXJhcmNoaWNhbC5wYXJlbnRSZWZlcmVuY2VbaS5pZF07aWYodm9pZCAwPT09b3x8dm9pZCAwPT09bilyZXR1cm4hMTtmb3IodmFyIHM9MDtzPG8ubGVuZ3RoO3MrKylmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKylpZihvW3NdPT1uW3JdKXJldHVybiEwO3JldHVybiExfSxjPWZ1bmN0aW9uKGUsaSxvKXtmb3IodmFyIG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIHM9aVtuXSxyPXQuZGlzdHJpYnV0aW9uT3JkZXJpbmdbc107aWYoci5sZW5ndGg+MSlmb3IodmFyIGE9MDthPHIubGVuZ3RoLTE7YSsrKSEwPT09dShyW2FdLHJbYSsxXSkmJnQuaGllcmFyY2hpY2FsLnRyZWVzW3JbYV0uaWRdPT09dC5oaWVyYXJjaGljYWwudHJlZXNbclthKzFdLmlkXSYmZShyW2FdLHJbYSsxXSxvKX19LHA9ZnVuY3Rpb24oaSxvKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLHM9dC5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkoaSkscj10Ll9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeShvKTtpZihNYXRoLmFicyhyLXMpPnQub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcpe3ZhciB1PXt9LGM9e307aChpLHUpLGgobyxjKTt2YXIgcD1sKGksbyksZj1kKHUscCksbT0oMCxhLmRlZmF1bHQpKGYsNCksdj0obVswXSxtWzFdKSxnPShtWzJdLG1bM10sZChjLHApKSx5PSgwLGEuZGVmYXVsdCkoZyw0KSxiPXlbMF0sXz0oeVsxXSx5WzJdKTtpZih5WzNdLE1hdGguYWJzKHYtYik+dC5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZyl7dmFyIHc9di1iK3Qub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmc7dzwtXyt0Lm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nJiYodz0tXyt0Lm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nKSx3PDAmJih0Ll9zaGlmdEJsb2NrKG8uaWQsdyksZT0hMCwhMD09PW4mJnQuX2NlbnRlclBhcmVudChvKSl9fX0sZj1mdW5jdGlvbihvLG4pe2Zvcih2YXIgcz1uLmlkLHI9bi5lZGdlcyxsPXQuaGllcmFyY2hpY2FsLmxldmVsc1tuLmlkXSx1PXQub3B0aW9ucy5oaWVyYXJjaGljYWwubGV2ZWxTZXBhcmF0aW9uKnQub3B0aW9ucy5oaWVyYXJjaGljYWwubGV2ZWxTZXBhcmF0aW9uLGM9e30scD1bXSxmPTA7ZjxyLmxlbmd0aDtmKyspe3ZhciBtPXJbZl07aWYobS50b0lkIT1tLmZyb21JZCl7dmFyIHY9bS50b0lkPT1zP20uZnJvbTptLnRvO2NbcltmXS5pZF09dix0LmhpZXJhcmNoaWNhbC5sZXZlbHNbdi5pZF08bCYmcC5wdXNoKG0pfX12YXIgZz1mdW5jdGlvbihlLGkpe2Zvcih2YXIgbz0wLG49MDtuPGkubGVuZ3RoO24rKylpZih2b2lkIDAhPT1jW2lbbl0uaWRdKXt2YXIgcz10Ll9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeShjW2lbbl0uaWRdKS1lO28rPXMvTWF0aC5zcXJ0KHMqcyt1KX1yZXR1cm4gb30seT1mdW5jdGlvbihlLGkpe2Zvcih2YXIgbz0wLG49MDtuPGkubGVuZ3RoO24rKylpZih2b2lkIDAhPT1jW2lbbl0uaWRdKXt2YXIgcz10Ll9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeShjW2lbbl0uaWRdKS1lO28tPXUqTWF0aC5wb3cocypzK3UsLTEuNSl9cmV0dXJuIG99LGI9ZnVuY3Rpb24oZSxpKXtmb3IodmFyIG89dC5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkobikscz17fSxyPTA7cjxlO3IrKyl7dmFyIGE9ZyhvLGkpLGg9eShvLGkpO2lmKG8tPU1hdGgubWF4KC00MCxNYXRoLm1pbig0MCxNYXRoLnJvdW5kKGEvaCkpKSx2b2lkIDAhPT1zW29dKWJyZWFrO3Nbb109cn1yZXR1cm4gb30sXz1iKG8scCk7IWZ1bmN0aW9uKG8pe3ZhciBzPXQuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KG4pO2lmKHZvaWQgMD09PWlbbi5pZF0pe3ZhciByPXt9O2gobixyKSxpW24uaWRdPXJ9dmFyIGw9ZChpW24uaWRdKSx1PSgwLGEuZGVmYXVsdCkobCw0KSxjPSh1WzBdLHVbMV0sdVsyXSkscD11WzNdLGY9by1zLG09MDtmPjA/bT1NYXRoLm1pbihmLHAtdC5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZyk6ZjwwJiYobT0tTWF0aC5taW4oLWYsYy10Lm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nKSksMCE9bSYmKHQuX3NoaWZ0QmxvY2sobi5pZCxtKSxlPSEwKX0oXyksXz1iKG8sciksZnVuY3Rpb24oaSl7dmFyIG89dC5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkobikscz10Ll9nZXRTcGFjZUFyb3VuZE5vZGUobikscj0oMCxhLmRlZmF1bHQpKHMsMiksaD1yWzBdLGQ9clsxXSxsPWktbyx1PW87bD4wP3U9TWF0aC5taW4obysoZC10Lm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nKSxpKTpsPDAmJih1PU1hdGgubWF4KG8tKGgtdC5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZyksaSkpLHUhPT1vJiYodC5fc2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkobix1LHZvaWQgMCwhMCksZT0hMCl9KF8pfTshMD09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuYmxvY2tTaGlmdGluZyYmKGZ1bmN0aW9uKGkpe3ZhciBvPSgwLHMuZGVmYXVsdCkodC5kaXN0cmlidXRpb25PcmRlcmluZyk7bz1vLnJldmVyc2UoKTtmb3IodmFyIG49MDtuPGkmJihlPSExLGMocCxvLCEwKSwhMD09PWUpO24rKyk7fSg1KSxmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0LmJvZHkubm9kZXMpdC5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGUpJiZ0Ll9jZW50ZXJQYXJlbnQodC5ib2R5Lm5vZGVzW2VdKX0oKSksITA9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVkZ2VNaW5pbWl6YXRpb24mJmZ1bmN0aW9uKGkpe3ZhciBvPSgwLHMuZGVmYXVsdCkodC5kaXN0cmlidXRpb25PcmRlcmluZyk7bz1vLnJldmVyc2UoKTtmb3IodmFyIG49MDtuPGk7bisrKXtlPSExO2Zvcih2YXIgcj0wO3I8by5sZW5ndGg7cisrKWZvcih2YXIgYT1vW3JdLGg9dC5kaXN0cmlidXRpb25PcmRlcmluZ1thXSxkPTA7ZDxoLmxlbmd0aDtkKyspZigxZTMsaFtkXSk7aWYoITAhPT1lKWJyZWFrfX0oMjApLCEwPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5wYXJlbnRDZW50cmFsaXphdGlvbiYmZnVuY3Rpb24oKXt2YXIgZT0oMCxzLmRlZmF1bHQpKHQuZGlzdHJpYnV0aW9uT3JkZXJpbmcpO2U9ZS5yZXZlcnNlKCk7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspZm9yKHZhciBvPWVbaV0sbj10LmRpc3RyaWJ1dGlvbk9yZGVyaW5nW29dLHI9MDtyPG4ubGVuZ3RoO3IrKyl0Ll9jZW50ZXJQYXJlbnQobltyXSl9KCksZnVuY3Rpb24oKXtmb3IodmFyIGU9cigpLGk9MCxuPTA7bjxlLmxlbmd0aC0xO24rKyl7aSs9ZVtuXS5tYXgtZVtuKzFdLm1pbit0Lm9wdGlvbnMuaGllcmFyY2hpY2FsLnRyZWVTcGFjaW5nLG8obisxLGkpfX0oKX19LHtrZXk6Il9nZXRTcGFjZUFyb3VuZE5vZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ITA7dm9pZCAwPT09ZSYmKGk9ITEpO3ZhciBvPXRoaXMuaGllcmFyY2hpY2FsLmxldmVsc1t0LmlkXTtpZih2b2lkIDAhPT1vKXt2YXIgbj10aGlzLmRpc3RyaWJ1dGlvbkluZGV4W3QuaWRdLHM9dGhpcy5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkodCkscj0xZTksYT0xZTk7aWYoMCE9PW4pe3ZhciBoPXRoaXMuZGlzdHJpYnV0aW9uT3JkZXJpbmdbb11bbi0xXTtpZighMD09PWkmJnZvaWQgMD09PWVbaC5pZF18fCExPT09aSl7cj1zLXRoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KGgpfX1pZihuIT10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW29dLmxlbmd0aC0xKXt2YXIgZD10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW29dW24rMV07aWYoITA9PT1pJiZ2b2lkIDA9PT1lW2QuaWRdfHwhMT09PWkpe3ZhciBsPXRoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KGQpO2E9TWF0aC5taW4oYSxsLXMpfX1yZXR1cm5bcixhXX1yZXR1cm5bMCwwXX19LHtrZXk6Il9jZW50ZXJQYXJlbnQiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHRoaXMuaGllcmFyY2hpY2FsLnBhcmVudFJlZmVyZW5jZVt0LmlkXSlmb3IodmFyIGU9dGhpcy5oaWVyYXJjaGljYWwucGFyZW50UmVmZXJlbmNlW3QuaWRdLGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXSxuPXRoaXMuYm9keS5ub2Rlc1tvXTtpZih0aGlzLmhpZXJhcmNoaWNhbC5jaGlsZHJlblJlZmVyZW5jZVtvXSl7dmFyIHM9MWU5LHI9LTFlOSxoPXRoaXMuaGllcmFyY2hpY2FsLmNoaWxkcmVuUmVmZXJlbmNlW29dO2lmKGgubGVuZ3RoPjApZm9yKHZhciBkPTA7ZDxoLmxlbmd0aDtkKyspe3ZhciBsPXRoaXMuYm9keS5ub2Rlc1toW2RdXTtzPU1hdGgubWluKHMsdGhpcy5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkobCkpLHI9TWF0aC5tYXgocix0aGlzLl9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeShsKSl9dmFyIHU9dGhpcy5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkobiksYz10aGlzLl9nZXRTcGFjZUFyb3VuZE5vZGUobikscD0oMCxhLmRlZmF1bHQpKGMsMiksZj1wWzBdLG09cFsxXSx2PS41KihzK3IpLGc9dS12OyhnPDAmJk1hdGguYWJzKGcpPG0tdGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZ3x8Zz4wJiZNYXRoLmFicyhnKTxmLXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcpJiZ0aGlzLl9zZXRQb3NpdGlvbkZvckhpZXJhcmNoeShuLHYsdm9pZCAwLCEwKX19fX0se2tleToiX3BsYWNlTm9kZXNCeUhpZXJhcmNoeSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5wb3NpdGlvbmVkTm9kZXM9e307Zm9yKHZhciBlIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIGk9KDAscy5kZWZhdWx0KSh0W2VdKTtpPXRoaXMuX2luZGV4QXJyYXlUb05vZGVzKGkpLHRoaXMuX3NvcnROb2RlQXJyYXkoaSk7Zm9yKHZhciBvPTAsbj0wO248aS5sZW5ndGg7bisrKXt2YXIgcj1pW25dO2lmKHZvaWQgMD09PXRoaXMucG9zaXRpb25lZE5vZGVzW3IuaWRdKXt2YXIgYT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nKm87bz4wJiYoYT10aGlzLl9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeShpW24tMV0pK3RoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcpLHRoaXMuX3NldFBvc2l0aW9uRm9ySGllcmFyY2h5KHIsYSxlKSx0aGlzLl92YWxpZGF0ZVBvc2l0aW9uQW5kQ29udGludWUocixlLGEpLG8rK319fX19LHtrZXk6Il9wbGFjZUJyYW5jaE5vZGVzIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PXRoaXMuaGllcmFyY2hpY2FsLmNoaWxkcmVuUmVmZXJlbmNlW3RdKXtmb3IodmFyIGk9W10sbz0wO288dGhpcy5oaWVyYXJjaGljYWwuY2hpbGRyZW5SZWZlcmVuY2VbdF0ubGVuZ3RoO28rKylpLnB1c2godGhpcy5ib2R5Lm5vZGVzW3RoaXMuaGllcmFyY2hpY2FsLmNoaWxkcmVuUmVmZXJlbmNlW3RdW29dXSk7dGhpcy5fc29ydE5vZGVBcnJheShpKTtmb3IodmFyIG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIHM9aVtuXSxyPXRoaXMuaGllcmFyY2hpY2FsLmxldmVsc1tzLmlkXTtpZighKHI+ZSYmdm9pZCAwPT09dGhpcy5wb3NpdGlvbmVkTm9kZXNbcy5pZF0pKXJldHVybjt2YXIgYT12b2lkIDA7YT0wPT09bj90aGlzLl9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeSh0aGlzLmJvZHkubm9kZXNbdF0pOnRoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KGlbbi0xXSkrdGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZyx0aGlzLl9zZXRQb3NpdGlvbkZvckhpZXJhcmNoeShzLGEsciksdGhpcy5fdmFsaWRhdGVQb3NpdGlvbkFuZENvbnRpbnVlKHMscixhKX1mb3IodmFyIGg9MWU5LGQ9LTFlOSxsPTA7bDxpLmxlbmd0aDtsKyspe3ZhciB1PWlbbF0uaWQ7aD1NYXRoLm1pbihoLHRoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KHRoaXMuYm9keS5ub2Rlc1t1XSkpLGQ9TWF0aC5tYXgoZCx0aGlzLl9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeSh0aGlzLmJvZHkubm9kZXNbdV0pKX10aGlzLl9zZXRQb3NpdGlvbkZvckhpZXJhcmNoeSh0aGlzLmJvZHkubm9kZXNbdF0sLjUqKGgrZCksZSl9fX0se2tleToiX3ZhbGlkYXRlUG9zaXRpb25BbmRDb250aW51ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2lmKHRoaXMuaGllcmFyY2hpY2FsLmlzVHJlZSl7aWYodm9pZCAwIT09dGhpcy5sYXN0Tm9kZU9uTGV2ZWxbZV0pe3ZhciBvPXRoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KHRoaXMuYm9keS5ub2Rlc1t0aGlzLmxhc3ROb2RlT25MZXZlbFtlXV0pO2lmKGktbzx0aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nKXt2YXIgbj1vK3RoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmctaSxzPXRoaXMuX2ZpbmRDb21tb25QYXJlbnQodGhpcy5sYXN0Tm9kZU9uTGV2ZWxbZV0sdC5pZCk7dGhpcy5fc2hpZnRCbG9jayhzLndpdGhDaGlsZCxuKX19dGhpcy5sYXN0Tm9kZU9uTGV2ZWxbZV09dC5pZCx0aGlzLnBvc2l0aW9uZWROb2Rlc1t0LmlkXT0hMCx0aGlzLl9wbGFjZUJyYW5jaE5vZGVzKHQuaWQsZSl9fX0se2tleToiX2luZGV4QXJyYXlUb05vZGVzIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5sZW5ndGg7aSsrKWUucHVzaCh0aGlzLmJvZHkubm9kZXNbdFtpXV0pO3JldHVybiBlfX0se2tleToiX2dldERpc3RyaWJ1dGlvbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD17fSxlPXZvaWQgMCxpPXZvaWQgMDtmb3IoZSBpbiB0aGlzLmJvZHkubm9kZXMpaWYodGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGUpKXtpPXRoaXMuYm9keS5ub2Rlc1tlXTt2YXIgbz12b2lkIDA9PT10aGlzLmhpZXJhcmNoaWNhbC5sZXZlbHNbZV0/MDp0aGlzLmhpZXJhcmNoaWNhbC5sZXZlbHNbZV07IlVEIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9ufHwiRFUiPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5kaXJlY3Rpb24/KGkueT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmxldmVsU2VwYXJhdGlvbipvLGkub3B0aW9ucy5maXhlZC55PSEwKTooaS54PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubGV2ZWxTZXBhcmF0aW9uKm8saS5vcHRpb25zLmZpeGVkLng9ITApLHZvaWQgMD09PXRbb10mJih0W29dPXt9KSx0W29dW2VdPWl9cmV0dXJuIHR9fSx7a2V5OiJfZ2V0SHViU2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzLmJvZHkubm9kZXMpaWYodGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGUpKXt2YXIgaT10aGlzLmJvZHkubm9kZXNbZV07dm9pZCAwPT09dGhpcy5oaWVyYXJjaGljYWwubGV2ZWxzW2VdJiYodD1pLmVkZ2VzLmxlbmd0aDx0P3Q6aS5lZGdlcy5sZW5ndGgpfXJldHVybiB0fX0se2tleToiX2RldGVybWluZUxldmVsc0J5SHVic2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTEsaT1mdW5jdGlvbihlLGkpe3QuaGllcmFyY2hpY2FsLmxldmVsRG93bnN0cmVhbShlLGkpfTtlPjAmJjAhPT0oZT10aGlzLl9nZXRIdWJTaXplKCkpOylmb3IodmFyIG8gaW4gdGhpcy5ib2R5Lm5vZGVzKWlmKHRoaXMuYm9keS5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShvKSl7dmFyIG49dGhpcy5ib2R5Lm5vZGVzW29dO24uZWRnZXMubGVuZ3RoPT09ZSYmdGhpcy5fY3Jhd2xOZXR3b3JrKGksbyl9fX0se2tleToiX2RldGVybWluZUxldmVsc0N1c3RvbUNhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1mdW5jdGlvbihlLGksbyl7dm9pZCAwPT09dC5oaWVyYXJjaGljYWwubGV2ZWxzW2UuaWRdJiYodC5oaWVyYXJjaGljYWwubGV2ZWxzW2UuaWRdPTFlNSk7dmFyIG49KG0uY2xvbmVPcHRpb25zKGUsIm5vZGUiKSxtLmNsb25lT3B0aW9ucyhpLCJub2RlIiksdm9pZCBtLmNsb25lT3B0aW9ucyhvLCJlZGdlIikpO3QuaGllcmFyY2hpY2FsLmxldmVsc1tpLmlkXT10LmhpZXJhcmNoaWNhbC5sZXZlbHNbZS5pZF0rbn07dGhpcy5fY3Jhd2xOZXR3b3JrKGUpLHRoaXMuaGllcmFyY2hpY2FsLnNldE1pbkxldmVsVG9aZXJvKHRoaXMuYm9keS5ub2Rlcyl9fSx7a2V5OiJfZGV0ZXJtaW5lTGV2ZWxzRGlyZWN0ZWQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWZ1bmN0aW9uKGUsaSxvKXt2b2lkIDA9PT10LmhpZXJhcmNoaWNhbC5sZXZlbHNbZS5pZF0mJih0LmhpZXJhcmNoaWNhbC5sZXZlbHNbZS5pZF09MWU0KSxvLnRvSWQ9PWkuaWQ/dC5oaWVyYXJjaGljYWwubGV2ZWxzW2kuaWRdPXQuaGllcmFyY2hpY2FsLmxldmVsc1tlLmlkXSsxOnQuaGllcmFyY2hpY2FsLmxldmVsc1tpLmlkXT10LmhpZXJhcmNoaWNhbC5sZXZlbHNbZS5pZF0tMX07dGhpcy5fY3Jhd2xOZXR3b3JrKGUpLHRoaXMuaGllcmFyY2hpY2FsLnNldE1pbkxldmVsVG9aZXJvKHRoaXMuYm9keS5ub2Rlcyl9fSx7a2V5OiJfZ2VuZXJhdGVNYXAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWZ1bmN0aW9uKGUsaSl7dC5oaWVyYXJjaGljYWwubGV2ZWxzW2kuaWRdPnQuaGllcmFyY2hpY2FsLmxldmVsc1tlLmlkXSYmdC5oaWVyYXJjaGljYWwuYWRkUmVsYXRpb24oZS5pZCxpLmlkKX07dGhpcy5fY3Jhd2xOZXR3b3JrKGUpLHRoaXMuaGllcmFyY2hpY2FsLmNoZWNrSWZUcmVlKCl9fSx7a2V5OiJfY3Jhd2xOZXR3b3JrIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ZnVuY3Rpb24oKXt9LGk9YXJndW1lbnRzWzFdLG89e30sbj0wLHM9ZnVuY3Rpb24gaShuLHMpe2lmKHZvaWQgMD09PW9bbi5pZF0pe3ZvaWQgMD09PXQuaGllcmFyY2hpY2FsLnRyZWVzW24uaWRdJiYodC5oaWVyYXJjaGljYWwudHJlZXNbbi5pZF09cyx0LnRyZWVJbmRleD1NYXRoLm1heChzLHQudHJlZUluZGV4KSksb1tuLmlkXT0hMDtmb3IodmFyIHI9dm9pZCAwLGE9MDthPG4uZWRnZXMubGVuZ3RoO2ErKykhMD09PW4uZWRnZXNbYV0uY29ubmVjdGVkJiYocj1uLmVkZ2VzW2FdLnRvSWQ9PT1uLmlkP24uZWRnZXNbYV0uZnJvbTpuLmVkZ2VzW2FdLnRvLG4uaWQhPT1yLmlkJiYoZShuLHIsbi5lZGdlc1thXSksaShyLHMpKSl9fTtpZih2b2lkIDA9PT1pKWZvcih2YXIgcj0wO3I8dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtyKyspe3ZhciBhPXRoaXMuYm9keS5ub2Rlc1t0aGlzLmJvZHkubm9kZUluZGljZXNbcl1dO3ZvaWQgMD09PW9bYS5pZF0mJihzKGEsbiksbis9MSl9ZWxzZXt2YXIgaD10aGlzLmJvZHkubm9kZXNbaV07aWYodm9pZCAwPT09aClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJOb2RlIG5vdCBmb3VuZDoiLGkpO3MoaCl9fX0se2tleToiX3NoaWZ0QmxvY2siLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxvPXt9OyFmdW5jdGlvbiB0KG4pe2lmKCFvW25dJiYob1tuXT0hMCwiVUQiPT09aS5vcHRpb25zLmhpZXJhcmNoaWNhbC5kaXJlY3Rpb258fCJEVSI9PT1pLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbj9pLmJvZHkubm9kZXNbbl0ueCs9ZTppLmJvZHkubm9kZXNbbl0ueSs9ZSx2b2lkIDAhPT1pLmhpZXJhcmNoaWNhbC5jaGlsZHJlblJlZmVyZW5jZVtuXSkpZm9yKHZhciBzPTA7czxpLmhpZXJhcmNoaWNhbC5jaGlsZHJlblJlZmVyZW5jZVtuXS5sZW5ndGg7cysrKXQoaS5oaWVyYXJjaGljYWwuY2hpbGRyZW5SZWZlcmVuY2Vbbl1bc10pfSh0KX19LHtrZXk6Il9maW5kQ29tbW9uUGFyZW50Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMsbz17fTtyZXR1cm4gZnVuY3Rpb24gdChlLG8pe2lmKHZvaWQgMCE9PWkuaGllcmFyY2hpY2FsLnBhcmVudFJlZmVyZW5jZVtvXSlmb3IodmFyIG49MDtuPGkuaGllcmFyY2hpY2FsLnBhcmVudFJlZmVyZW5jZVtvXS5sZW5ndGg7bisrKXt2YXIgcz1pLmhpZXJhcmNoaWNhbC5wYXJlbnRSZWZlcmVuY2Vbb11bbl07ZVtzXT0hMCx0KGUscyl9fShvLHQpLGZ1bmN0aW9uIHQoZSxvKXtpZih2b2lkIDAhPT1pLmhpZXJhcmNoaWNhbC5wYXJlbnRSZWZlcmVuY2Vbb10pZm9yKHZhciBuPTA7bjxpLmhpZXJhcmNoaWNhbC5wYXJlbnRSZWZlcmVuY2Vbb10ubGVuZ3RoO24rKyl7dmFyIHM9aS5oaWVyYXJjaGljYWwucGFyZW50UmVmZXJlbmNlW29dW25dO2lmKHZvaWQgMCE9PWVbc10pcmV0dXJue2ZvdW5kUGFyZW50OnMsd2l0aENoaWxkOm99O3ZhciByPXQoZSxzKTtpZihudWxsIT09ci5mb3VuZFBhcmVudClyZXR1cm4gcn1yZXR1cm57Zm91bmRQYXJlbnQ6bnVsbCx3aXRoQ2hpbGQ6b319KG8sZSl9fSx7a2V5OiJfc2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXshMCE9PShhcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdKSYmKHZvaWQgMD09PXRoaXMuZGlzdHJpYnV0aW9uT3JkZXJpbmdbaV0mJih0aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW2ldPVtdLHRoaXMuZGlzdHJpYnV0aW9uT3JkZXJpbmdQcmVzZW5jZVtpXT17fSksdm9pZCAwPT09dGhpcy5kaXN0cmlidXRpb25PcmRlcmluZ1ByZXNlbmNlW2ldW3QuaWRdJiYodGhpcy5kaXN0cmlidXRpb25PcmRlcmluZ1tpXS5wdXNoKHQpLHRoaXMuZGlzdHJpYnV0aW9uSW5kZXhbdC5pZF09dGhpcy5kaXN0cmlidXRpb25PcmRlcmluZ1tpXS5sZW5ndGgtMSksdGhpcy5kaXN0cmlidXRpb25PcmRlcmluZ1ByZXNlbmNlW2ldW3QuaWRdPSEwKSwiVUQiPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5kaXJlY3Rpb258fCJEVSI9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbj90Lng9ZTp0Lnk9ZX19LHtrZXk6Il9pc1ZlcnRpY2FsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiJVRCI9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbnx8IkRVIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9ufX0se2tleToiX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5Iix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4iVUQiPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5kaXJlY3Rpb258fCJEVSI9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbj90Lng6dC55fX0se2tleToiX3NvcnROb2RlQXJyYXkiLHZhbHVlOmZ1bmN0aW9uKHQpe3QubGVuZ3RoPjEmJigiVUQiPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5kaXJlY3Rpb258fCJEVSI9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbj90LnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC54LWUueH0pOnQuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LnktZS55fSkpfX1dKSx0fSgpO2UuZGVmYXVsdD1nfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoNTgpLHM9byhuKSxyPWkoOTApLGE9byhyKSxoPWkoNjIpLGQ9byhoKSxsPWkoMTM0KSx1PW8obCksYz1pKDEzNSkscD1vKGMpLGY9aSgxKSxtPWkoMTEyKSx2PWkoMTE5KSxnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7dmFyIG49dGhpczsoMCx1LmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5jYW52YXM9aSx0aGlzLnNlbGVjdGlvbkhhbmRsZXI9byx0aGlzLmVkaXRNb2RlPSExLHRoaXMubWFuaXB1bGF0aW9uRGl2PXZvaWQgMCx0aGlzLmVkaXRNb2RlRGl2PXZvaWQgMCx0aGlzLmNsb3NlRGl2PXZvaWQgMCx0aGlzLm1hbmlwdWxhdGlvbkhhbW1lcnM9W10sdGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9ucz17fSx0aGlzLnRlbXBvcmFyeUV2ZW50RnVuY3Rpb25zPVtdLHRoaXMudG91Y2hUaW1lPTAsdGhpcy50ZW1wb3JhcnlJZHM9e25vZGVzOltdLGVkZ2VzOltdfSx0aGlzLmd1aUVuYWJsZWQ9ITEsdGhpcy5pbk1vZGU9ITEsdGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlPXZvaWQgMCx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17ZW5hYmxlZDohMSxpbml0aWFsbHlBY3RpdmU6ITEsYWRkTm9kZTohMCxhZGRFZGdlOiEwLGVkaXROb2RlOnZvaWQgMCxlZGl0RWRnZTohMCxkZWxldGVOb2RlOiEwLGRlbGV0ZUVkZ2U6ITAsY29udHJvbE5vZGVTdHlsZTp7c2hhcGU6ImRvdCIsc2l6ZTo2LGNvbG9yOntiYWNrZ3JvdW5kOiIjZmYwMDAwIixib3JkZXI6IiMzYzNjM2MiLGhpZ2hsaWdodDp7YmFja2dyb3VuZDoiIzA3Zjk2OCIsYm9yZGVyOiIjM2MzYzNjIn19LGJvcmRlcldpZHRoOjIsYm9yZGVyV2lkdGhTZWxlY3RlZDoyfX0sZi5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJkZXN0cm95IixmdW5jdGlvbigpe24uX2NsZWFuKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX2RhdGFDaGFuZ2VkIix0aGlzLl9yZXN0b3JlLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJfcmVzZXREYXRhIix0aGlzLl9yZXN0b3JlLmJpbmQodGhpcykpfXJldHVybigwLHAuZGVmYXVsdCkodCxbe2tleToiX3Jlc3RvcmUiLHZhbHVlOmZ1bmN0aW9uKCl7ITEhPT10aGlzLmluTW9kZSYmKCEwPT09dGhpcy5vcHRpb25zLmluaXRpYWxseUFjdGl2ZT90aGlzLmVuYWJsZUVkaXRNb2RlKCk6dGhpcy5kaXNhYmxlRWRpdE1vZGUoKSl9fSx7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dm9pZCAwIT09ZSYmKHZvaWQgMCE9PWUubG9jYWxlP3RoaXMub3B0aW9ucy5sb2NhbGU9ZS5sb2NhbGU6dGhpcy5vcHRpb25zLmxvY2FsZT1pLmxvY2FsZSx2b2lkIDAhPT1lLmxvY2FsZXM/dGhpcy5vcHRpb25zLmxvY2FsZXM9ZS5sb2NhbGVzOnRoaXMub3B0aW9ucy5sb2NhbGVzPWkubG9jYWxlcyksdm9pZCAwIT09dCYmKCJib29sZWFuIj09dHlwZW9mIHQ/dGhpcy5vcHRpb25zLmVuYWJsZWQ9dDoodGhpcy5vcHRpb25zLmVuYWJsZWQ9ITAsZi5kZWVwRXh0ZW5kKHRoaXMub3B0aW9ucyx0KSksITA9PT10aGlzLm9wdGlvbnMuaW5pdGlhbGx5QWN0aXZlJiYodGhpcy5lZGl0TW9kZT0hMCksdGhpcy5fc2V0dXAoKSl9fSx7a2V5OiJ0b2dnbGVFZGl0TW9kZSIsdmFsdWU6ZnVuY3Rpb24oKXshMD09PXRoaXMuZWRpdE1vZGU/dGhpcy5kaXNhYmxlRWRpdE1vZGUoKTp0aGlzLmVuYWJsZUVkaXRNb2RlKCl9fSx7a2V5OiJlbmFibGVFZGl0TW9kZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmVkaXRNb2RlPSEwLHRoaXMuX2NsZWFuKCksITA9PT10aGlzLmd1aUVuYWJsZWQmJih0aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5jbG9zZURpdi5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5lZGl0TW9kZURpdi5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9fSx7a2V5OiJkaXNhYmxlRWRpdE1vZGUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5lZGl0TW9kZT0hMSx0aGlzLl9jbGVhbigpLCEwPT09dGhpcy5ndWlFbmFibGVkJiYodGhpcy5tYW5pcHVsYXRpb25EaXYuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5jbG9zZURpdi5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLmVkaXRNb2RlRGl2LnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLl9jcmVhdGVFZGl0QnV0dG9uKCkpfX0se2tleToic2hvd01hbmlwdWxhdG9yVG9vbGJhciIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLl9jbGVhbigpLHRoaXMubWFuaXB1bGF0aW9uRE9NPXt9LCEwPT09dGhpcy5ndWlFbmFibGVkKXt0aGlzLmVkaXRNb2RlPSEwLHRoaXMubWFuaXB1bGF0aW9uRGl2LnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLmNsb3NlRGl2LnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt2YXIgdD10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dldFNlbGVjdGVkTm9kZUNvdW50KCksZT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dldFNlbGVjdGVkRWRnZUNvdW50KCksaT10K2Usbz10aGlzLm9wdGlvbnMubG9jYWxlc1t0aGlzLm9wdGlvbnMubG9jYWxlXSxuPSExOyExIT09dGhpcy5vcHRpb25zLmFkZE5vZGUmJih0aGlzLl9jcmVhdGVBZGROb2RlQnV0dG9uKG8pLG49ITApLCExIT09dGhpcy5vcHRpb25zLmFkZEVkZ2UmJighMD09PW4/dGhpcy5fY3JlYXRlU2VwZXJhdG9yKDEpOm49ITAsdGhpcy5fY3JlYXRlQWRkRWRnZUJ1dHRvbihvKSksMT09PXQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuZWRpdE5vZGU/KCEwPT09bj90aGlzLl9jcmVhdGVTZXBlcmF0b3IoMik6bj0hMCx0aGlzLl9jcmVhdGVFZGl0Tm9kZUJ1dHRvbihvKSk6MT09PWUmJjA9PT10JiYhMSE9PXRoaXMub3B0aW9ucy5lZGl0RWRnZSYmKCEwPT09bj90aGlzLl9jcmVhdGVTZXBlcmF0b3IoMyk6bj0hMCx0aGlzLl9jcmVhdGVFZGl0RWRnZUJ1dHRvbihvKSksMCE9PWkmJih0PjAmJiExIT09dGhpcy5vcHRpb25zLmRlbGV0ZU5vZGU/KCEwPT09biYmdGhpcy5fY3JlYXRlU2VwZXJhdG9yKDQpLHRoaXMuX2NyZWF0ZURlbGV0ZUJ1dHRvbihvKSk6MD09PXQmJiExIT09dGhpcy5vcHRpb25zLmRlbGV0ZUVkZ2UmJighMD09PW4mJnRoaXMuX2NyZWF0ZVNlcGVyYXRvcig0KSx0aGlzLl9jcmVhdGVEZWxldGVCdXR0b24obykpKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYodGhpcy5jbG9zZURpdix0aGlzLnRvZ2dsZUVkaXRNb2RlLmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRFdmVudCgic2VsZWN0Iix0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIuYmluZCh0aGlzKSl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlZHJhdyIpfX0se2tleToiYWRkTm9kZU1vZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoITAhPT10aGlzLmVkaXRNb2RlJiZ0aGlzLmVuYWJsZUVkaXRNb2RlKCksdGhpcy5fY2xlYW4oKSx0aGlzLmluTW9kZT0iYWRkTm9kZSIsITA9PT10aGlzLmd1aUVuYWJsZWQpe3ZhciB0PXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO3RoaXMubWFuaXB1bGF0aW9uRE9NPXt9LHRoaXMuX2NyZWF0ZUJhY2tCdXR0b24odCksdGhpcy5fY3JlYXRlU2VwZXJhdG9yKCksdGhpcy5fY3JlYXRlRGVzY3JpcHRpb24odC5hZGREZXNjcmlwdGlvbnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uYWRkRGVzY3JpcHRpb24pLHRoaXMuX2JpbmRIYW1tZXJUb0Rpdih0aGlzLmNsb3NlRGl2LHRoaXMudG9nZ2xlRWRpdE1vZGUuYmluZCh0aGlzKSl9dGhpcy5fdGVtcG9yYXJ5QmluZEV2ZW50KCJjbGljayIsdGhpcy5fcGVyZm9ybUFkZE5vZGUuYmluZCh0aGlzKSl9fSx7a2V5OiJlZGl0Tm9kZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzOyEwIT09dGhpcy5lZGl0TW9kZSYmdGhpcy5lbmFibGVFZGl0TW9kZSgpLHRoaXMuX2NsZWFuKCk7dmFyIGU9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZXRTZWxlY3RlZE5vZGUoKTtpZih2b2lkIDAhPT1lKXtpZih0aGlzLmluTW9kZT0iZWRpdE5vZGUiLCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLm9wdGlvbnMuZWRpdE5vZGUpdGhyb3cgbmV3IEVycm9yKCJObyBmdW5jdGlvbiBoYXMgYmVlbiBjb25maWd1cmVkIHRvIGhhbmRsZSB0aGUgZWRpdGluZyBvZiBub2Rlcy4iKTtpZighMCE9PWUuaXNDbHVzdGVyKXt2YXIgaT1mLmRlZXBFeHRlbmQoe30sZS5vcHRpb25zLCExKTtpZihpLng9ZS54LGkueT1lLnksMiE9PXRoaXMub3B0aW9ucy5lZGl0Tm9kZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgZnVuY3Rpb24gZm9yIGVkaXQgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLCBjYWxsYmFjaykiKTt0aGlzLm9wdGlvbnMuZWRpdE5vZGUoaSxmdW5jdGlvbihlKXtudWxsIT09ZSYmdm9pZCAwIT09ZSYmImVkaXROb2RlIj09PXQuaW5Nb2RlJiZ0LmJvZHkuZGF0YS5ub2Rlcy5nZXREYXRhU2V0KCkudXBkYXRlKGUpLHQuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpfSl9ZWxzZSBhbGVydCh0aGlzLm9wdGlvbnMubG9jYWxlc1t0aGlzLm9wdGlvbnMubG9jYWxlXS5lZGl0Q2x1c3RlckVycm9yfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5lZGl0Q2x1c3RlckVycm9yKX1lbHNlIHRoaXMuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpfX0se2tleToiYWRkRWRnZU1vZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoITAhPT10aGlzLmVkaXRNb2RlJiZ0aGlzLmVuYWJsZUVkaXRNb2RlKCksdGhpcy5fY2xlYW4oKSx0aGlzLmluTW9kZT0iYWRkRWRnZSIsITA9PT10aGlzLmd1aUVuYWJsZWQpe3ZhciB0PXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO3RoaXMubWFuaXB1bGF0aW9uRE9NPXt9LHRoaXMuX2NyZWF0ZUJhY2tCdXR0b24odCksdGhpcy5fY3JlYXRlU2VwZXJhdG9yKCksdGhpcy5fY3JlYXRlRGVzY3JpcHRpb24odC5lZGdlRGVzY3JpcHRpb258fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmVkZ2VEZXNjcmlwdGlvbiksdGhpcy5fYmluZEhhbW1lclRvRGl2KHRoaXMuY2xvc2VEaXYsdGhpcy50b2dnbGVFZGl0TW9kZS5iaW5kKHRoaXMpKX10aGlzLl90ZW1wb3JhcnlCaW5kVUkoIm9uVG91Y2giLHRoaXMuX2hhbmRsZUNvbm5lY3QuYmluZCh0aGlzKSksdGhpcy5fdGVtcG9yYXJ5QmluZFVJKCJvbkRyYWdFbmQiLHRoaXMuX2ZpbmlzaENvbm5lY3QuYmluZCh0aGlzKSksdGhpcy5fdGVtcG9yYXJ5QmluZFVJKCJvbkRyYWciLHRoaXMuX2RyYWdDb250cm9sTm9kZS5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoIm9uUmVsZWFzZSIsdGhpcy5fZmluaXNoQ29ubmVjdC5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoIm9uRHJhZ1N0YXJ0IixmdW5jdGlvbigpe30pLHRoaXMuX3RlbXBvcmFyeUJpbmRVSSgib25Ib2xkIixmdW5jdGlvbigpe30pfX0se2tleToiZWRpdEVkZ2VNb2RlIix2YWx1ZTpmdW5jdGlvbigpe2lmKCEwIT09dGhpcy5lZGl0TW9kZSYmdGhpcy5lbmFibGVFZGl0TW9kZSgpLHRoaXMuX2NsZWFuKCksdGhpcy5pbk1vZGU9ImVkaXRFZGdlIiwib2JqZWN0Ij09PSgwLGQuZGVmYXVsdCkodGhpcy5vcHRpb25zLmVkaXRFZGdlKSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub3B0aW9ucy5lZGl0RWRnZS5lZGl0V2l0aG91dERyYWcmJih0aGlzLmVkZ2VCZWluZ0VkaXRlZElkPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRTZWxlY3RlZEVkZ2VzKClbMF0sdm9pZCAwIT09dGhpcy5lZGdlQmVpbmdFZGl0ZWRJZCkpe3ZhciB0PXRoaXMuYm9keS5lZGdlc1t0aGlzLmVkZ2VCZWluZ0VkaXRlZElkXTtyZXR1cm4gdm9pZCB0aGlzLl9wZXJmb3JtRWRpdEVkZ2UodC5mcm9tLHQudG8pfWlmKCEwPT09dGhpcy5ndWlFbmFibGVkKXt2YXIgZT10aGlzLm9wdGlvbnMubG9jYWxlc1t0aGlzLm9wdGlvbnMubG9jYWxlXTt0aGlzLm1hbmlwdWxhdGlvbkRPTT17fSx0aGlzLl9jcmVhdGVCYWNrQnV0dG9uKGUpLHRoaXMuX2NyZWF0ZVNlcGVyYXRvcigpLHRoaXMuX2NyZWF0ZURlc2NyaXB0aW9uKGUuZWRpdEVkZ2VEZXNjcmlwdGlvbnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uZWRpdEVkZ2VEZXNjcmlwdGlvbiksdGhpcy5fYmluZEhhbW1lclRvRGl2KHRoaXMuY2xvc2VEaXYsdGhpcy50b2dnbGVFZGl0TW9kZS5iaW5kKHRoaXMpKX1pZih0aGlzLmVkZ2VCZWluZ0VkaXRlZElkPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRTZWxlY3RlZEVkZ2VzKClbMF0sdm9pZCAwIT09dGhpcy5lZGdlQmVpbmdFZGl0ZWRJZCl7dmFyIGk9dGhpcy5ib2R5LmVkZ2VzW3RoaXMuZWRnZUJlaW5nRWRpdGVkSWRdLG89dGhpcy5fZ2V0TmV3VGFyZ2V0Tm9kZShpLmZyb20ueCxpLmZyb20ueSksbj10aGlzLl9nZXROZXdUYXJnZXROb2RlKGkudG8ueCxpLnRvLnkpO3RoaXMudGVtcG9yYXJ5SWRzLm5vZGVzLnB1c2goby5pZCksdGhpcy50ZW1wb3JhcnlJZHMubm9kZXMucHVzaChuLmlkKSx0aGlzLmJvZHkubm9kZXNbby5pZF09byx0aGlzLmJvZHkubm9kZUluZGljZXMucHVzaChvLmlkKSx0aGlzLmJvZHkubm9kZXNbbi5pZF09bix0aGlzLmJvZHkubm9kZUluZGljZXMucHVzaChuLmlkKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoIm9uVG91Y2giLHRoaXMuX2NvbnRyb2xOb2RlVG91Y2guYmluZCh0aGlzKSksdGhpcy5fdGVtcG9yYXJ5QmluZFVJKCJvblRhcCIsZnVuY3Rpb24oKXt9KSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoIm9uSG9sZCIsZnVuY3Rpb24oKXt9KSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoIm9uRHJhZ1N0YXJ0Iix0aGlzLl9jb250cm9sTm9kZURyYWdTdGFydC5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoIm9uRHJhZyIsdGhpcy5fY29udHJvbE5vZGVEcmFnLmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSSgib25EcmFnRW5kIix0aGlzLl9jb250cm9sTm9kZURyYWdFbmQuYmluZCh0aGlzKSksdGhpcy5fdGVtcG9yYXJ5QmluZFVJKCJvbk1vdXNlTW92ZSIsZnVuY3Rpb24oKXt9KSx0aGlzLl90ZW1wb3JhcnlCaW5kRXZlbnQoImJlZm9yZURyYXdpbmciLGZ1bmN0aW9uKHQpe3ZhciBlPWkuZWRnZVR5cGUuZmluZEJvcmRlclBvc2l0aW9ucyh0KTshMT09PW8uc2VsZWN0ZWQmJihvLng9ZS5mcm9tLngsby55PWUuZnJvbS55KSwhMT09PW4uc2VsZWN0ZWQmJihuLng9ZS50by54LG4ueT1lLnRvLnkpfSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlZHJhdyIpfWVsc2UgdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fSx7a2V5OiJkZWxldGVTZWxlY3RlZCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzOyEwIT09dGhpcy5lZGl0TW9kZSYmdGhpcy5lbmFibGVFZGl0TW9kZSgpLHRoaXMuX2NsZWFuKCksdGhpcy5pbk1vZGU9ImRlbGV0ZSI7dmFyIGU9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkTm9kZXMoKSxpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRTZWxlY3RlZEVkZ2VzKCksbz12b2lkIDA7aWYoZS5sZW5ndGg+MCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoITA9PT10aGlzLmJvZHkubm9kZXNbZVtuXV0uaXNDbHVzdGVyKXJldHVybiB2b2lkIGFsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmRlbGV0ZUNsdXN0ZXJFcnJvcnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uZGVsZXRlQ2x1c3RlckVycm9yKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5vcHRpb25zLmRlbGV0ZU5vZGUmJihvPXRoaXMub3B0aW9ucy5kZWxldGVOb2RlKX1lbHNlIGkubGVuZ3RoPjAmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuZGVsZXRlRWRnZSYmKG89dGhpcy5vcHRpb25zLmRlbGV0ZUVkZ2UpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvKXt2YXIgcz17bm9kZXM6ZSxlZGdlczppfTtpZigyIT09by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgZnVuY3Rpb24gZm9yIGRlbGV0ZSBkb2VzIG5vdCBzdXBwb3J0IHR3byBhcmd1bWVudHMgKGRhdGEsIGNhbGxiYWNrKSIpO28ocyxmdW5jdGlvbihlKXtudWxsIT09ZSYmdm9pZCAwIT09ZSYmImRlbGV0ZSI9PT10LmluTW9kZT8odC5ib2R5LmRhdGEuZWRnZXMuZ2V0RGF0YVNldCgpLnJlbW92ZShlLmVkZ2VzKSx0LmJvZHkuZGF0YS5ub2Rlcy5nZXREYXRhU2V0KCkucmVtb3ZlKGUubm9kZXMpLHQuYm9keS5lbWl0dGVyLmVtaXQoInN0YXJ0U2ltdWxhdGlvbiIpLHQuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpKToodC5ib2R5LmVtaXR0ZXIuZW1pdCgic3RhcnRTaW11bGF0aW9uIiksdC5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCkpfSl9ZWxzZSB0aGlzLmJvZHkuZGF0YS5lZGdlcy5nZXREYXRhU2V0KCkucmVtb3ZlKGkpLHRoaXMuYm9keS5kYXRhLm5vZGVzLmdldERhdGFTZXQoKS5yZW1vdmUoZSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgic3RhcnRTaW11bGF0aW9uIiksdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fSx7a2V5OiJfc2V0dXAiLHZhbHVlOmZ1bmN0aW9uKCl7ITA9PT10aGlzLm9wdGlvbnMuZW5hYmxlZD8odGhpcy5ndWlFbmFibGVkPSEwLHRoaXMuX2NyZWF0ZVdyYXBwZXJzKCksITE9PT10aGlzLmVkaXRNb2RlP3RoaXMuX2NyZWF0ZUVkaXRCdXR0b24oKTp0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSk6KHRoaXMuX3JlbW92ZU1hbmlwdWxhdGlvbkRPTSgpLHRoaXMuZ3VpRW5hYmxlZD0hMSl9fSx7a2V5OiJfY3JlYXRlV3JhcHBlcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwPT09dGhpcy5tYW5pcHVsYXRpb25EaXYmJih0aGlzLm1hbmlwdWxhdGlvbkRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLm1hbmlwdWxhdGlvbkRpdi5jbGFzc05hbWU9InZpcy1tYW5pcHVsYXRpb24iLCEwPT09dGhpcy5lZGl0TW9kZT90aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PSJibG9jayI6dGhpcy5tYW5pcHVsYXRpb25EaXYuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5jYW52YXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5tYW5pcHVsYXRpb25EaXYpKSx2b2lkIDA9PT10aGlzLmVkaXRNb2RlRGl2JiYodGhpcy5lZGl0TW9kZURpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVkaXRNb2RlRGl2LmNsYXNzTmFtZT0idmlzLWVkaXQtbW9kZSIsITA9PT10aGlzLmVkaXRNb2RlP3RoaXMuZWRpdE1vZGVEaXYuc3R5bGUuZGlzcGxheT0ibm9uZSI6dGhpcy5lZGl0TW9kZURpdi5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5jYW52YXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5lZGl0TW9kZURpdikpLHZvaWQgMD09PXRoaXMuY2xvc2VEaXYmJih0aGlzLmNsb3NlRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY2xvc2VEaXYuY2xhc3NOYW1lPSJ2aXMtY2xvc2UiLHRoaXMuY2xvc2VEaXYuc3R5bGUuZGlzcGxheT10aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5LHRoaXMuY2FudmFzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuY2xvc2VEaXYpKX19LHtrZXk6Il9nZXROZXdUYXJnZXROb2RlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWYuZGVlcEV4dGVuZCh7fSx0aGlzLm9wdGlvbnMuY29udHJvbE5vZGVTdHlsZSk7aS5pZD0idGFyZ2V0Tm9kZSIrZi5yYW5kb21VVUlEKCksaS5oaWRkZW49ITEsaS5waHlzaWNzPSExLGkueD10LGkueT1lO3ZhciBvPXRoaXMuYm9keS5mdW5jdGlvbnMuY3JlYXRlTm9kZShpKTtyZXR1cm4gby5zaGFwZS5ib3VuZGluZ0JveD17bGVmdDp0LHJpZ2h0OnQsdG9wOmUsYm90dG9tOmV9LG99fSx7a2V5OiJfY3JlYXRlRWRpdEJ1dHRvbiIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9jbGVhbigpLHRoaXMubWFuaXB1bGF0aW9uRE9NPXt9LGYucmVjdXJzaXZlRE9NRGVsZXRlKHRoaXMuZWRpdE1vZGVEaXYpO3ZhciB0PXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLGU9dGhpcy5fY3JlYXRlQnV0dG9uKCJlZGl0TW9kZSIsInZpcy1idXR0b24gdmlzLWVkaXQgdmlzLWVkaXQtbW9kZSIsdC5lZGl0fHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5lZGl0KTt0aGlzLmVkaXRNb2RlRGl2LmFwcGVuZENoaWxkKGUpLHRoaXMuX2JpbmRIYW1tZXJUb0RpdihlLHRoaXMudG9nZ2xlRWRpdE1vZGUuYmluZCh0aGlzKSl9fSx7a2V5OiJfY2xlYW4iLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5pbk1vZGU9ITEsITA9PT10aGlzLmd1aUVuYWJsZWQmJihmLnJlY3Vyc2l2ZURPTURlbGV0ZSh0aGlzLmVkaXRNb2RlRGl2KSxmLnJlY3Vyc2l2ZURPTURlbGV0ZSh0aGlzLm1hbmlwdWxhdGlvbkRpdiksdGhpcy5fY2xlYW5NYW5pcHVsYXRvckhhbW1lcnMoKSksdGhpcy5fY2xlYW51cFRlbXBvcmFyeU5vZGVzQW5kRWRnZXMoKSx0aGlzLl91bmJpbmRUZW1wb3JhcnlVSXMoKSx0aGlzLl91bmJpbmRUZW1wb3JhcnlFdmVudHMoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJyZXN0b3JlUGh5c2ljcyIpfX0se2tleToiX2NsZWFuTWFuaXB1bGF0b3JIYW1tZXJzIix2YWx1ZTpmdW5jdGlvbigpe2lmKDAhPXRoaXMubWFuaXB1bGF0aW9uSGFtbWVycy5sZW5ndGgpe2Zvcih2YXIgdD0wO3Q8dGhpcy5tYW5pcHVsYXRpb25IYW1tZXJzLmxlbmd0aDt0KyspdGhpcy5tYW5pcHVsYXRpb25IYW1tZXJzW3RdLmRlc3Ryb3koKTt0aGlzLm1hbmlwdWxhdGlvbkhhbW1lcnM9W119fX0se2tleToiX3JlbW92ZU1hbmlwdWxhdGlvbkRPTSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9jbGVhbigpLGYucmVjdXJzaXZlRE9NRGVsZXRlKHRoaXMubWFuaXB1bGF0aW9uRGl2KSxmLnJlY3Vyc2l2ZURPTURlbGV0ZSh0aGlzLmVkaXRNb2RlRGl2KSxmLnJlY3Vyc2l2ZURPTURlbGV0ZSh0aGlzLmNsb3NlRGl2KSx0aGlzLm1hbmlwdWxhdGlvbkRpdiYmdGhpcy5jYW52YXMuZnJhbWUucmVtb3ZlQ2hpbGQodGhpcy5tYW5pcHVsYXRpb25EaXYpLHRoaXMuZWRpdE1vZGVEaXYmJnRoaXMuY2FudmFzLmZyYW1lLnJlbW92ZUNoaWxkKHRoaXMuZWRpdE1vZGVEaXYpLHRoaXMuY2xvc2VEaXYmJnRoaXMuY2FudmFzLmZyYW1lLnJlbW92ZUNoaWxkKHRoaXMuY2xvc2VEaXYpLHRoaXMubWFuaXB1bGF0aW9uRGl2PXZvaWQgMCx0aGlzLmVkaXRNb2RlRGl2PXZvaWQgMCx0aGlzLmNsb3NlRGl2PXZvaWQgMH19LHtrZXk6Il9jcmVhdGVTZXBlcmF0b3IiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjE7dGhpcy5tYW5pcHVsYXRpb25ET01bInNlcGVyYXRvckxpbmVEaXYiK3RdPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMubWFuaXB1bGF0aW9uRE9NWyJzZXBlcmF0b3JMaW5lRGl2Iit0XS5jbGFzc05hbWU9InZpcy1zZXBhcmF0b3ItbGluZSIsCnRoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKHRoaXMubWFuaXB1bGF0aW9uRE9NWyJzZXBlcmF0b3JMaW5lRGl2Iit0XSl9fSx7a2V5OiJfY3JlYXRlQWRkTm9kZUJ1dHRvbiIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY3JlYXRlQnV0dG9uKCJhZGROb2RlIiwidmlzLWJ1dHRvbiB2aXMtYWRkIix0LmFkZE5vZGV8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmFkZE5vZGUpO3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKGUpLHRoaXMuX2JpbmRIYW1tZXJUb0RpdihlLHRoaXMuYWRkTm9kZU1vZGUuYmluZCh0aGlzKSl9fSx7a2V5OiJfY3JlYXRlQWRkRWRnZUJ1dHRvbiIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY3JlYXRlQnV0dG9uKCJhZGRFZGdlIiwidmlzLWJ1dHRvbiB2aXMtY29ubmVjdCIsdC5hZGRFZGdlfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5hZGRFZGdlKTt0aGlzLm1hbmlwdWxhdGlvbkRpdi5hcHBlbmRDaGlsZChlKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYoZSx0aGlzLmFkZEVkZ2VNb2RlLmJpbmQodGhpcykpfX0se2tleToiX2NyZWF0ZUVkaXROb2RlQnV0dG9uIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jcmVhdGVCdXR0b24oImVkaXROb2RlIiwidmlzLWJ1dHRvbiB2aXMtZWRpdCIsdC5lZGl0Tm9kZXx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uZWRpdE5vZGUpO3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKGUpLHRoaXMuX2JpbmRIYW1tZXJUb0RpdihlLHRoaXMuZWRpdE5vZGUuYmluZCh0aGlzKSl9fSx7a2V5OiJfY3JlYXRlRWRpdEVkZ2VCdXR0b24iLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NyZWF0ZUJ1dHRvbigiZWRpdEVkZ2UiLCJ2aXMtYnV0dG9uIHZpcy1lZGl0Iix0LmVkaXRFZGdlfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5lZGl0RWRnZSk7dGhpcy5tYW5pcHVsYXRpb25EaXYuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYmluZEhhbW1lclRvRGl2KGUsdGhpcy5lZGl0RWRnZU1vZGUuYmluZCh0aGlzKSl9fSx7a2V5OiJfY3JlYXRlRGVsZXRlQnV0dG9uIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMucnRsKXZhciBlPSJ2aXMtYnV0dG9uIHZpcy1kZWxldGUtcnRsIjtlbHNlIHZhciBlPSJ2aXMtYnV0dG9uIHZpcy1kZWxldGUiO3ZhciBpPXRoaXMuX2NyZWF0ZUJ1dHRvbigiZGVsZXRlIixlLHQuZGVsfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5kZWwpO3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKGkpLHRoaXMuX2JpbmRIYW1tZXJUb0RpdihpLHRoaXMuZGVsZXRlU2VsZWN0ZWQuYmluZCh0aGlzKSl9fSx7a2V5OiJfY3JlYXRlQmFja0J1dHRvbiIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY3JlYXRlQnV0dG9uKCJiYWNrIiwidmlzLWJ1dHRvbiB2aXMtYmFjayIsdC5iYWNrfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5iYWNrKTt0aGlzLm1hbmlwdWxhdGlvbkRpdi5hcHBlbmRDaGlsZChlKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYoZSx0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIuYmluZCh0aGlzKSl9fSx7a2V5OiJfY3JlYXRlQnV0dG9uIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOiJ2aXMtbGFiZWwiO3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbkRPTVt0KyJEaXYiXT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLm1hbmlwdWxhdGlvbkRPTVt0KyJEaXYiXS5jbGFzc05hbWU9ZSx0aGlzLm1hbmlwdWxhdGlvbkRPTVt0KyJMYWJlbCJdPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMubWFuaXB1bGF0aW9uRE9NW3QrIkxhYmVsIl0uY2xhc3NOYW1lPW8sdGhpcy5tYW5pcHVsYXRpb25ET01bdCsiTGFiZWwiXS5pbm5lckhUTUw9aSx0aGlzLm1hbmlwdWxhdGlvbkRPTVt0KyJEaXYiXS5hcHBlbmRDaGlsZCh0aGlzLm1hbmlwdWxhdGlvbkRPTVt0KyJMYWJlbCJdKSx0aGlzLm1hbmlwdWxhdGlvbkRPTVt0KyJEaXYiXX19LHtrZXk6Il9jcmVhdGVEZXNjcmlwdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5tYW5pcHVsYXRpb25EaXYuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlQnV0dG9uKCJkZXNjcmlwdGlvbiIsInZpcy1idXR0b24gdmlzLW5vbmUiLHQpKX19LHtrZXk6Il90ZW1wb3JhcnlCaW5kRXZlbnQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy50ZW1wb3JhcnlFdmVudEZ1bmN0aW9ucy5wdXNoKHtldmVudDp0LGJvdW5kRnVuY3Rpb246ZX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKHQsZSl9fSx7a2V5OiJfdGVtcG9yYXJ5QmluZFVJIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMD09PXRoaXMuYm9keS5ldmVudExpc3RlbmVyc1t0XSl0aHJvdyBuZXcgRXJyb3IoIlRoaXMgVUkgZnVuY3Rpb24gZG9lcyBub3QgZXhpc3QuIFR5cG8/IFlvdSB0cmllZDogIit0KyIgcG9zc2libGUgYXJlOiAiKygwLGEuZGVmYXVsdCkoKDAscy5kZWZhdWx0KSh0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMpKSk7dGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9uc1t0XT10aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnNbdF0sdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzW3RdPWV9fSx7a2V5OiJfdW5iaW5kVGVtcG9yYXJ5VUlzIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnRlbXBvcmFyeVVJRnVuY3Rpb25zKXRoaXMudGVtcG9yYXJ5VUlGdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodCkmJih0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnNbdF09dGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9uc1t0XSxkZWxldGUgdGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9uc1t0XSk7dGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9ucz17fX19LHtrZXk6Il91bmJpbmRUZW1wb3JhcnlFdmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnRlbXBvcmFyeUV2ZW50RnVuY3Rpb25zLmxlbmd0aDt0Kyspe3ZhciBlPXRoaXMudGVtcG9yYXJ5RXZlbnRGdW5jdGlvbnNbdF0uZXZlbnQsaT10aGlzLnRlbXBvcmFyeUV2ZW50RnVuY3Rpb25zW3RdLmJvdW5kRnVuY3Rpb247dGhpcy5ib2R5LmVtaXR0ZXIub2ZmKGUsaSl9dGhpcy50ZW1wb3JhcnlFdmVudEZ1bmN0aW9ucz1bXX19LHtrZXk6Il9iaW5kSGFtbWVyVG9EaXYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IG0odCx7fSk7di5vblRvdWNoKGksZSksdGhpcy5tYW5pcHVsYXRpb25IYW1tZXJzLnB1c2goaSl9fSx7a2V5OiJfY2xlYW51cFRlbXBvcmFyeU5vZGVzQW5kRWRnZXMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnRlbXBvcmFyeUlkcy5lZGdlcy5sZW5ndGg7dCsrKXt0aGlzLmJvZHkuZWRnZXNbdGhpcy50ZW1wb3JhcnlJZHMuZWRnZXNbdF1dLmRpc2Nvbm5lY3QoKSxkZWxldGUgdGhpcy5ib2R5LmVkZ2VzW3RoaXMudGVtcG9yYXJ5SWRzLmVkZ2VzW3RdXTt2YXIgZT10aGlzLmJvZHkuZWRnZUluZGljZXMuaW5kZXhPZih0aGlzLnRlbXBvcmFyeUlkcy5lZGdlc1t0XSk7LTEhPT1lJiZ0aGlzLmJvZHkuZWRnZUluZGljZXMuc3BsaWNlKGUsMSl9Zm9yKHZhciBpPTA7aTx0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlcy5sZW5ndGg7aSsrKXtkZWxldGUgdGhpcy5ib2R5Lm5vZGVzW3RoaXMudGVtcG9yYXJ5SWRzLm5vZGVzW2ldXTt2YXIgbz10aGlzLmJvZHkubm9kZUluZGljZXMuaW5kZXhPZih0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1tpXSk7LTEhPT1vJiZ0aGlzLmJvZHkubm9kZUluZGljZXMuc3BsaWNlKG8sMSl9dGhpcy50ZW1wb3JhcnlJZHM9e25vZGVzOltdLGVkZ2VzOltdfX19LHtrZXk6Il9jb250cm9sTm9kZVRvdWNoIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSx0aGlzLmxhc3RUb3VjaD10aGlzLmJvZHkuZnVuY3Rpb25zLmdldFBvaW50ZXIodC5jZW50ZXIpLHRoaXMubGFzdFRvdWNoLnRyYW5zbGF0aW9uPWYuZXh0ZW5kKHt9LHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uKX19LHtrZXk6Il9jb250cm9sTm9kZURyYWdTdGFydCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sYXN0VG91Y2gsaT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX3BvaW50ZXJUb1Bvc2l0aW9uT2JqZWN0KGUpLG89dGhpcy5ib2R5Lm5vZGVzW3RoaXMudGVtcG9yYXJ5SWRzLm5vZGVzWzBdXSxuPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1sxXV0scz10aGlzLmJvZHkuZWRnZXNbdGhpcy5lZGdlQmVpbmdFZGl0ZWRJZF07dGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlPXZvaWQgMDt2YXIgcj1vLmlzT3ZlcmxhcHBpbmdXaXRoKGkpLGE9bi5pc092ZXJsYXBwaW5nV2l0aChpKTshMD09PXI/KHRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZT1vLHMuZWRnZVR5cGUuZnJvbT1vKTohMD09PWEmJih0aGlzLnNlbGVjdGVkQ29udHJvbE5vZGU9bixzLmVkZ2VUeXBlLnRvPW4pLHZvaWQgMCE9PXRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZSYmdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNlbGVjdE9iamVjdCh0aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZWRyYXciKX19LHtrZXk6Il9jb250cm9sTm9kZURyYWciLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoImRpc2FibGVQaHlzaWNzIik7dmFyIGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyKHQuY2VudGVyKSxpPXRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKGUpO2lmKHZvaWQgMCE9PXRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZSl0aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUueD1pLngsdGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlLnk9aS55O2Vsc2V7dmFyIG89ZS54LXRoaXMubGFzdFRvdWNoLngsbj1lLnktdGhpcy5sYXN0VG91Y2gueTt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj17eDp0aGlzLmxhc3RUb3VjaC50cmFuc2xhdGlvbi54K28seTp0aGlzLmxhc3RUb3VjaC50cmFuc2xhdGlvbi55K259fXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZWRyYXciKX19LHtrZXk6Il9jb250cm9sTm9kZURyYWdFbmQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcih0LmNlbnRlciksaT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX3BvaW50ZXJUb1Bvc2l0aW9uT2JqZWN0KGUpLG89dGhpcy5ib2R5LmVkZ2VzW3RoaXMuZWRnZUJlaW5nRWRpdGVkSWRdO2lmKHZvaWQgMCE9PXRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZSl7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsKCk7Zm9yKHZhciBuPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2V0QWxsTm9kZXNPdmVybGFwcGluZ1dpdGgoaSkscz12b2lkIDAscj1uLmxlbmd0aC0xO3I+PTA7ci0tKWlmKG5bcl0hPT10aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUuaWQpe3M9dGhpcy5ib2R5Lm5vZGVzW25bcl1dO2JyZWFrfWlmKHZvaWQgMCE9PXMmJnZvaWQgMCE9PXRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZSlpZighMD09PXMuaXNDbHVzdGVyKWFsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmNyZWF0ZUVkZ2VFcnJvcnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uY3JlYXRlRWRnZUVycm9yKTtlbHNle3ZhciBhPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1swXV07dGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlLmlkPT09YS5pZD90aGlzLl9wZXJmb3JtRWRpdEVkZ2Uocy5pZCxvLnRvLmlkKTp0aGlzLl9wZXJmb3JtRWRpdEVkZ2Uoby5mcm9tLmlkLHMuaWQpfWVsc2Ugby51cGRhdGVFZGdlVHlwZSgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInJlc3RvcmVQaHlzaWNzIik7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlZHJhdyIpfX19LHtrZXk6Il9oYW5kbGVDb25uZWN0Iix2YWx1ZTpmdW5jdGlvbih0KXtpZigobmV3IERhdGUpLnZhbHVlT2YoKS10aGlzLnRvdWNoVGltZT4xMDApe3RoaXMubGFzdFRvdWNoPXRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcih0LmNlbnRlciksdGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb249Zi5leHRlbmQoe30sdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24pO3ZhciBlPXRoaXMubGFzdFRvdWNoLGk9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldE5vZGVBdChlKTtpZih2b2lkIDAhPT1pKWlmKCEwPT09aS5pc0NsdXN0ZXIpYWxlcnQodGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV0uY3JlYXRlRWRnZUVycm9yfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5jcmVhdGVFZGdlRXJyb3IpO2Vsc2V7dmFyIG89dGhpcy5fZ2V0TmV3VGFyZ2V0Tm9kZShpLngsaS55KTt0aGlzLmJvZHkubm9kZXNbby5pZF09byx0aGlzLmJvZHkubm9kZUluZGljZXMucHVzaChvLmlkKTt2YXIgbj10aGlzLmJvZHkuZnVuY3Rpb25zLmNyZWF0ZUVkZ2Uoe2lkOiJjb25uZWN0aW9uRWRnZSIrZi5yYW5kb21VVUlEKCksZnJvbTppLmlkLHRvOm8uaWQscGh5c2ljczohMSxzbW9vdGg6e2VuYWJsZWQ6ITAsdHlwZToiY29udGludW91cyIscm91bmRuZXNzOi41fX0pO3RoaXMuYm9keS5lZGdlc1tuLmlkXT1uLHRoaXMuYm9keS5lZGdlSW5kaWNlcy5wdXNoKG4uaWQpLHRoaXMudGVtcG9yYXJ5SWRzLm5vZGVzLnB1c2goby5pZCksdGhpcy50ZW1wb3JhcnlJZHMuZWRnZXMucHVzaChuLmlkKX10aGlzLnRvdWNoVGltZT0obmV3IERhdGUpLnZhbHVlT2YoKX19fSx7a2V5OiJfZHJhZ0NvbnRyb2xOb2RlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmJvZHkuZnVuY3Rpb25zLmdldFBvaW50ZXIodC5jZW50ZXIpO2lmKHZvaWQgMCE9PXRoaXMudGVtcG9yYXJ5SWRzLm5vZGVzWzBdKXt2YXIgaT10aGlzLmJvZHkubm9kZXNbdGhpcy50ZW1wb3JhcnlJZHMubm9kZXNbMF1dO2kueD10aGlzLmNhbnZhcy5fWGNvbnZlcnRET010b0NhbnZhcyhlLngpLGkueT10aGlzLmNhbnZhcy5fWWNvbnZlcnRET010b0NhbnZhcyhlLnkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZWRyYXciKX1lbHNle3ZhciBvPWUueC10aGlzLmxhc3RUb3VjaC54LG49ZS55LXRoaXMubGFzdFRvdWNoLnk7dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6dGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb24ueCtvLHk6dGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb24ueStufX19fSx7a2V5OiJfZmluaXNoQ29ubmVjdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyKHQuY2VudGVyKSxpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fcG9pbnRlclRvUG9zaXRpb25PYmplY3QoZSksbz12b2lkIDA7dm9pZCAwIT09dGhpcy50ZW1wb3JhcnlJZHMuZWRnZXNbMF0mJihvPXRoaXMuYm9keS5lZGdlc1t0aGlzLnRlbXBvcmFyeUlkcy5lZGdlc1swXV0uZnJvbUlkKTtmb3IodmFyIG49dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZXRBbGxOb2Rlc092ZXJsYXBwaW5nV2l0aChpKSxzPXZvaWQgMCxyPW4ubGVuZ3RoLTE7cj49MDtyLS0paWYoLTE9PT10aGlzLnRlbXBvcmFyeUlkcy5ub2Rlcy5pbmRleE9mKG5bcl0pKXtzPXRoaXMuYm9keS5ub2Rlc1tuW3JdXTticmVha310aGlzLl9jbGVhbnVwVGVtcG9yYXJ5Tm9kZXNBbmRFZGdlcygpLHZvaWQgMCE9PXMmJighMD09PXMuaXNDbHVzdGVyP2FsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmNyZWF0ZUVkZ2VFcnJvcnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uY3JlYXRlRWRnZUVycm9yKTp2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbb10mJnZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1tzLmlkXSYmdGhpcy5fcGVyZm9ybUFkZEVkZ2UobyxzLmlkKSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlZHJhdyIpfX0se2tleToiX3BlcmZvcm1BZGROb2RlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLGk9e2lkOmYucmFuZG9tVVVJRCgpLHg6dC5wb2ludGVyLmNhbnZhcy54LHk6dC5wb2ludGVyLmNhbnZhcy55LGxhYmVsOiJuZXcifTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5vcHRpb25zLmFkZE5vZGUpe2lmKDIhPT10aGlzLm9wdGlvbnMuYWRkTm9kZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgZnVuY3Rpb24gZm9yIGFkZCBkb2VzIG5vdCBzdXBwb3J0IHR3byBhcmd1bWVudHMgKGRhdGEsY2FsbGJhY2spIik7dGhpcy5vcHRpb25zLmFkZE5vZGUoaSxmdW5jdGlvbih0KXtudWxsIT09dCYmdm9pZCAwIT09dCYmImFkZE5vZGUiPT09ZS5pbk1vZGUmJihlLmJvZHkuZGF0YS5ub2Rlcy5nZXREYXRhU2V0KCkuYWRkKHQpLGUuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpKX0pfWVsc2UgdGhpcy5ib2R5LmRhdGEubm9kZXMuZ2V0RGF0YVNldCgpLmFkZChpKSx0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKX19LHtrZXk6Il9wZXJmb3JtQWRkRWRnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLG89e2Zyb206dCx0bzplfTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5vcHRpb25zLmFkZEVkZ2Upe2lmKDIhPT10aGlzLm9wdGlvbnMuYWRkRWRnZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgZnVuY3Rpb24gZm9yIGNvbm5lY3QgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLGNhbGxiYWNrKSIpO3RoaXMub3B0aW9ucy5hZGRFZGdlKG8sZnVuY3Rpb24odCl7bnVsbCE9PXQmJnZvaWQgMCE9PXQmJiJhZGRFZGdlIj09PWkuaW5Nb2RlJiYoaS5ib2R5LmRhdGEuZWRnZXMuZ2V0RGF0YVNldCgpLmFkZCh0KSxpLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSxpLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9KX1lbHNlIHRoaXMuYm9keS5kYXRhLmVkZ2VzLmdldERhdGFTZXQoKS5hZGQobyksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsKCksdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fSx7a2V5OiJfcGVyZm9ybUVkaXRFZGdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMsbz17aWQ6dGhpcy5lZGdlQmVpbmdFZGl0ZWRJZCxmcm9tOnQsdG86ZSxsYWJlbDp0aGlzLmJvZHkuZGF0YS5lZGdlcy5fZGF0YVt0aGlzLmVkZ2VCZWluZ0VkaXRlZElkXS5sYWJlbH0sbj10aGlzLm9wdGlvbnMuZWRpdEVkZ2U7aWYoIm9iamVjdCI9PT0odm9pZCAwPT09bj8idW5kZWZpbmVkIjooMCxkLmRlZmF1bHQpKG4pKSYmKG49bi5lZGl0V2l0aG91dERyYWcpLCJmdW5jdGlvbiI9PXR5cGVvZiBuKXtpZigyIT09bi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgZnVuY3Rpb24gZm9yIGVkaXQgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLCBjYWxsYmFjaykiKTtuKG8sZnVuY3Rpb24odCl7bnVsbD09PXR8fHZvaWQgMD09PXR8fCJlZGl0RWRnZSIhPT1pLmluTW9kZT8oaS5ib2R5LmVkZ2VzW28uaWRdLnVwZGF0ZUVkZ2VUeXBlKCksaS5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlZHJhdyIpLGkuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpKTooaS5ib2R5LmRhdGEuZWRnZXMuZ2V0RGF0YVNldCgpLnVwZGF0ZSh0KSxpLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSxpLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9KX1lbHNlIHRoaXMuYm9keS5kYXRhLmVkZ2VzLmdldERhdGFTZXQoKS51cGRhdGUobyksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsKCksdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fV0pLHR9KCk7ZS5kZWZhdWx0PWd9LGZ1bmN0aW9uKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPSJzdHJpbmciLG89ImJvb2xlYW4iLG49Im51bWJlciIscz0ib2JqZWN0IixyPXtjb25maWd1cmU6e2VuYWJsZWQ6e2Jvb2xlYW46b30sZmlsdGVyOntib29sZWFuOm8sc3RyaW5nOmksYXJyYXk6ImFycmF5IixmdW5jdGlvbjoiZnVuY3Rpb24ifSxjb250YWluZXI6e2RvbToiZG9tIn0sc2hvd0J1dHRvbjp7Ym9vbGVhbjpvfSxfX3R5cGVfXzp7b2JqZWN0OnMsYm9vbGVhbjpvLHN0cmluZzppLGFycmF5OiJhcnJheSIsZnVuY3Rpb246ImZ1bmN0aW9uIn19LGVkZ2VzOnthcnJvd3M6e3RvOntlbmFibGVkOntib29sZWFuOm99LHNjYWxlRmFjdG9yOntudW1iZXI6bn0sdHlwZTp7c3RyaW5nOlsiYXJyb3ciLCJjaXJjbGUiXX0sX190eXBlX186e29iamVjdDpzLGJvb2xlYW46b319LG1pZGRsZTp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxzY2FsZUZhY3Rvcjp7bnVtYmVyOm59LHR5cGU6e3N0cmluZzpbImFycm93IiwiY2lyY2xlIl19LF9fdHlwZV9fOntvYmplY3Q6cyxib29sZWFuOm99fSxmcm9tOntlbmFibGVkOntib29sZWFuOm99LHNjYWxlRmFjdG9yOntudW1iZXI6bn0sdHlwZTp7c3RyaW5nOlsiYXJyb3ciLCJjaXJjbGUiXX0sX190eXBlX186e29iamVjdDpzLGJvb2xlYW46b319LF9fdHlwZV9fOntzdHJpbmc6WyJmcm9tIiwidG8iLCJtaWRkbGUiXSxvYmplY3Q6c319LGFycm93U3RyaWtldGhyb3VnaDp7Ym9vbGVhbjpvfSxjaG9zZW46e2xhYmVsOntib29sZWFuOm8sZnVuY3Rpb246ImZ1bmN0aW9uIn0sZWRnZTp7Ym9vbGVhbjpvLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9LF9fdHlwZV9fOntvYmplY3Q6cyxib29sZWFuOm99fSxjb2xvcjp7Y29sb3I6e3N0cmluZzppfSxoaWdobGlnaHQ6e3N0cmluZzppfSxob3Zlcjp7c3RyaW5nOml9LGluaGVyaXQ6e3N0cmluZzpbImZyb20iLCJ0byIsImJvdGgiXSxib29sZWFuOm99LG9wYWNpdHk6e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnMsc3RyaW5nOml9fSxkYXNoZXM6e2Jvb2xlYW46byxhcnJheToiYXJyYXkifSxmb250Ontjb2xvcjp7c3RyaW5nOml9LHNpemU6e251bWJlcjpufSxmYWNlOntzdHJpbmc6aX0sYmFja2dyb3VuZDp7c3RyaW5nOml9LHN0cm9rZVdpZHRoOntudW1iZXI6bn0sc3Ryb2tlQ29sb3I6e3N0cmluZzppfSxhbGlnbjp7c3RyaW5nOlsiaG9yaXpvbnRhbCIsInRvcCIsIm1pZGRsZSIsImJvdHRvbSJdfSx2YWRqdXN0OntudW1iZXI6bn0sbXVsdGk6e2Jvb2xlYW46byxzdHJpbmc6aX0sYm9sZDp7Y29sb3I6e3N0cmluZzppfSxzaXplOntudW1iZXI6bn0sZmFjZTp7c3RyaW5nOml9LG1vZDp7c3RyaW5nOml9LHZhZGp1c3Q6e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnMsc3RyaW5nOml9fSxib2xkaXRhbDp7Y29sb3I6e3N0cmluZzppfSxzaXplOntudW1iZXI6bn0sZmFjZTp7c3RyaW5nOml9LG1vZDp7c3RyaW5nOml9LHZhZGp1c3Q6e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnMsc3RyaW5nOml9fSxpdGFsOntjb2xvcjp7c3RyaW5nOml9LHNpemU6e251bWJlcjpufSxmYWNlOntzdHJpbmc6aX0sbW9kOntzdHJpbmc6aX0sdmFkanVzdDp7bnVtYmVyOm59LF9fdHlwZV9fOntvYmplY3Q6cyxzdHJpbmc6aX19LG1vbm86e2NvbG9yOntzdHJpbmc6aX0sc2l6ZTp7bnVtYmVyOm59LGZhY2U6e3N0cmluZzppfSxtb2Q6e3N0cmluZzppfSx2YWRqdXN0OntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpzLHN0cmluZzppfX0sX190eXBlX186e29iamVjdDpzLHN0cmluZzppfX0saGlkZGVuOntib29sZWFuOm99LGhvdmVyV2lkdGg6e2Z1bmN0aW9uOiJmdW5jdGlvbiIsbnVtYmVyOm59LGxhYmVsOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LGxhYmVsSGlnaGxpZ2h0Qm9sZDp7Ym9vbGVhbjpvfSxsZW5ndGg6e251bWJlcjpuLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0scGh5c2ljczp7Ym9vbGVhbjpvfSxzY2FsaW5nOnttaW46e251bWJlcjpufSxtYXg6e251bWJlcjpufSxsYWJlbDp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxtaW46e251bWJlcjpufSxtYXg6e251bWJlcjpufSxtYXhWaXNpYmxlOntudW1iZXI6bn0sZHJhd1RocmVzaG9sZDp7bnVtYmVyOm59LF9fdHlwZV9fOntvYmplY3Q6cyxib29sZWFuOm99fSxjdXN0b21TY2FsaW5nRnVuY3Rpb246e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LF9fdHlwZV9fOntvYmplY3Q6c319LHNlbGVjdGlvbldpZHRoOntmdW5jdGlvbjoiZnVuY3Rpb24iLG51bWJlcjpufSxzZWxmUmVmZXJlbmNlU2l6ZTp7bnVtYmVyOm59LHNoYWRvdzp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxjb2xvcjp7c3RyaW5nOml9LHNpemU6e251bWJlcjpufSx4OntudW1iZXI6bn0seTp7bnVtYmVyOm59LF9fdHlwZV9fOntvYmplY3Q6cyxib29sZWFuOm99fSxzbW9vdGg6e2VuYWJsZWQ6e2Jvb2xlYW46b30sdHlwZTp7c3RyaW5nOlsiZHluYW1pYyIsImNvbnRpbnVvdXMiLCJkaXNjcmV0ZSIsImRpYWdvbmFsQ3Jvc3MiLCJzdHJhaWdodENyb3NzIiwiaG9yaXpvbnRhbCIsInZlcnRpY2FsIiwiY3VydmVkQ1ciLCJjdXJ2ZWRDQ1ciLCJjdWJpY0JlemllciJdfSxyb3VuZG5lc3M6e251bWJlcjpufSxmb3JjZURpcmVjdGlvbjp7c3RyaW5nOlsiaG9yaXpvbnRhbCIsInZlcnRpY2FsIiwibm9uZSJdLGJvb2xlYW46b30sX190eXBlX186e29iamVjdDpzLGJvb2xlYW46b319LHRpdGxlOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHdpZHRoOntudW1iZXI6bn0sd2lkdGhDb25zdHJhaW50OnttYXhpbXVtOntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpzLGJvb2xlYW46byxudW1iZXI6bn19LHZhbHVlOntudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntvYmplY3Q6c319LGdyb3Vwczp7dXNlRGVmYXVsdEdyb3Vwczp7Ym9vbGVhbjpvfSxfX2FueV9fOiJnZXQgZnJvbSBub2Rlcywgd2lsbCBiZSBvdmVyd3JpdHRlbiBiZWxvdyIsX190eXBlX186e29iamVjdDpzfX0saW50ZXJhY3Rpb246e2RyYWdOb2Rlczp7Ym9vbGVhbjpvfSxkcmFnVmlldzp7Ym9vbGVhbjpvfSxoaWRlRWRnZXNPbkRyYWc6e2Jvb2xlYW46b30saGlkZU5vZGVzT25EcmFnOntib29sZWFuOm99LGhvdmVyOntib29sZWFuOm99LGtleWJvYXJkOntlbmFibGVkOntib29sZWFuOm99LHNwZWVkOnt4OntudW1iZXI6bn0seTp7bnVtYmVyOm59LHpvb206e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxiaW5kVG9XaW5kb3c6e2Jvb2xlYW46b30sX190eXBlX186e29iamVjdDpzLGJvb2xlYW46b319LG11bHRpc2VsZWN0Ontib29sZWFuOm99LG5hdmlnYXRpb25CdXR0b25zOntib29sZWFuOm99LHNlbGVjdGFibGU6e2Jvb2xlYW46b30sc2VsZWN0Q29ubmVjdGVkRWRnZXM6e2Jvb2xlYW46b30saG92ZXJDb25uZWN0ZWRFZGdlczp7Ym9vbGVhbjpvfSx0b29sdGlwRGVsYXk6e251bWJlcjpufSx6b29tVmlldzp7Ym9vbGVhbjpvfSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxsYXlvdXQ6e3JhbmRvbVNlZWQ6e3VuZGVmaW5lZDoidW5kZWZpbmVkIixudW1iZXI6bn0saW1wcm92ZWRMYXlvdXQ6e2Jvb2xlYW46b30saGllcmFyY2hpY2FsOntlbmFibGVkOntib29sZWFuOm99LGxldmVsU2VwYXJhdGlvbjp7bnVtYmVyOm59LG5vZGVTcGFjaW5nOntudW1iZXI6bn0sdHJlZVNwYWNpbmc6e251bWJlcjpufSxibG9ja1NoaWZ0aW5nOntib29sZWFuOm99LGVkZ2VNaW5pbWl6YXRpb246e2Jvb2xlYW46b30scGFyZW50Q2VudHJhbGl6YXRpb246e2Jvb2xlYW46b30sZGlyZWN0aW9uOntzdHJpbmc6WyJVRCIsIkRVIiwiTFIiLCJSTCJdfSxzb3J0TWV0aG9kOntzdHJpbmc6WyJodWJzaXplIiwiZGlyZWN0ZWQiXX0sX190eXBlX186e29iamVjdDpzLGJvb2xlYW46b319LF9fdHlwZV9fOntvYmplY3Q6c319LG1hbmlwdWxhdGlvbjp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxpbml0aWFsbHlBY3RpdmU6e2Jvb2xlYW46b30sYWRkTm9kZTp7Ym9vbGVhbjpvLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9LGFkZEVkZ2U6e2Jvb2xlYW46byxmdW5jdGlvbjoiZnVuY3Rpb24ifSxlZGl0Tm9kZTp7ZnVuY3Rpb246ImZ1bmN0aW9uIn0sZWRpdEVkZ2U6e2VkaXRXaXRob3V0RHJhZzp7ZnVuY3Rpb246ImZ1bmN0aW9uIn0sX190eXBlX186e29iamVjdDpzLGJvb2xlYW46byxmdW5jdGlvbjoiZnVuY3Rpb24ifX0sZGVsZXRlTm9kZTp7Ym9vbGVhbjpvLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9LGRlbGV0ZUVkZ2U6e2Jvb2xlYW46byxmdW5jdGlvbjoiZnVuY3Rpb24ifSxjb250cm9sTm9kZVN0eWxlOiJnZXQgZnJvbSBub2Rlcywgd2lsbCBiZSBvdmVyd3JpdHRlbiBiZWxvdyIsX190eXBlX186e29iamVjdDpzLGJvb2xlYW46b319LG5vZGVzOntib3JkZXJXaWR0aDp7bnVtYmVyOm59LGJvcmRlcldpZHRoU2VsZWN0ZWQ6e251bWJlcjpuLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sYnJva2VuSW1hZ2U6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sY2hvc2VuOntsYWJlbDp7Ym9vbGVhbjpvLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9LG5vZGU6e2Jvb2xlYW46byxmdW5jdGlvbjoiZnVuY3Rpb24ifSxfX3R5cGVfXzp7b2JqZWN0OnMsYm9vbGVhbjpvfX0sY29sb3I6e2JvcmRlcjp7c3RyaW5nOml9LGJhY2tncm91bmQ6e3N0cmluZzppfSxoaWdobGlnaHQ6e2JvcmRlcjp7c3RyaW5nOml9LGJhY2tncm91bmQ6e3N0cmluZzppfSxfX3R5cGVfXzp7b2JqZWN0OnMsc3RyaW5nOml9fSxob3Zlcjp7Ym9yZGVyOntzdHJpbmc6aX0sYmFja2dyb3VuZDp7c3RyaW5nOml9LF9fdHlwZV9fOntvYmplY3Q6cyxzdHJpbmc6aX19LF9fdHlwZV9fOntvYmplY3Q6cyxzdHJpbmc6aX19LGZpeGVkOnt4Ontib29sZWFuOm99LHk6e2Jvb2xlYW46b30sX190eXBlX186e29iamVjdDpzLGJvb2xlYW46b319LGZvbnQ6e2FsaWduOntzdHJpbmc6aX0sY29sb3I6e3N0cmluZzppfSxzaXplOntudW1iZXI6bn0sZmFjZTp7c3RyaW5nOml9LGJhY2tncm91bmQ6e3N0cmluZzppfSxzdHJva2VXaWR0aDp7bnVtYmVyOm59LHN0cm9rZUNvbG9yOntzdHJpbmc6aX0sdmFkanVzdDp7bnVtYmVyOm59LG11bHRpOntib29sZWFuOm8sc3RyaW5nOml9LGJvbGQ6e2NvbG9yOntzdHJpbmc6aX0sc2l6ZTp7bnVtYmVyOm59LGZhY2U6e3N0cmluZzppfSxtb2Q6e3N0cmluZzppfSx2YWRqdXN0OntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpzLHN0cmluZzppfX0sYm9sZGl0YWw6e2NvbG9yOntzdHJpbmc6aX0sc2l6ZTp7bnVtYmVyOm59LGZhY2U6e3N0cmluZzppfSxtb2Q6e3N0cmluZzppfSx2YWRqdXN0OntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpzLHN0cmluZzppfX0saXRhbDp7Y29sb3I6e3N0cmluZzppfSxzaXplOntudW1iZXI6bn0sZmFjZTp7c3RyaW5nOml9LG1vZDp7c3RyaW5nOml9LHZhZGp1c3Q6e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnMsc3RyaW5nOml9fSxtb25vOntjb2xvcjp7c3RyaW5nOml9LHNpemU6e251bWJlcjpufSxmYWNlOntzdHJpbmc6aX0sbW9kOntzdHJpbmc6aX0sdmFkanVzdDp7bnVtYmVyOm59LF9fdHlwZV9fOntvYmplY3Q6cyxzdHJpbmc6aX19LF9fdHlwZV9fOntvYmplY3Q6cyxzdHJpbmc6aX19LGdyb3VwOntzdHJpbmc6aSxudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LGhlaWdodENvbnN0cmFpbnQ6e21pbmltdW06e251bWJlcjpufSx2YWxpZ246e3N0cmluZzppfSxfX3R5cGVfXzp7b2JqZWN0OnMsYm9vbGVhbjpvLG51bWJlcjpufX0saGlkZGVuOntib29sZWFuOm99LGljb246e2ZhY2U6e3N0cmluZzppfSxjb2RlOntzdHJpbmc6aX0sc2l6ZTp7bnVtYmVyOm59LGNvbG9yOntzdHJpbmc6aX0sX190eXBlX186e29iamVjdDpzfX0saWQ6e3N0cmluZzppLG51bWJlcjpufSxpbWFnZTp7c2VsZWN0ZWQ6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sdW5zZWxlY3RlZDp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxfX3R5cGVfXzp7b2JqZWN0OnMsc3RyaW5nOml9fSxsYWJlbDp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxsYWJlbEhpZ2hsaWdodEJvbGQ6e2Jvb2xlYW46b30sbGV2ZWw6e251bWJlcjpuLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sbWFyZ2luOnt0b3A6e251bWJlcjpufSxyaWdodDp7bnVtYmVyOm59LGJvdHRvbTp7bnVtYmVyOm59LGxlZnQ6e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnMsbnVtYmVyOm59fSxtYXNzOntudW1iZXI6bn0scGh5c2ljczp7Ym9vbGVhbjpvfSxzY2FsaW5nOnttaW46e251bWJlcjpufSxtYXg6e251bWJlcjpufSxsYWJlbDp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxtaW46e251bWJlcjpufSxtYXg6e251bWJlcjpufSxtYXhWaXNpYmxlOntudW1iZXI6bn0sZHJhd1RocmVzaG9sZDp7bnVtYmVyOm59LF9fdHlwZV9fOntvYmplY3Q6cyxib29sZWFuOm99fSxjdXN0b21TY2FsaW5nRnVuY3Rpb246e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LF9fdHlwZV9fOntvYmplY3Q6c319LHNoYWRvdzp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxjb2xvcjp7c3RyaW5nOml9LHNpemU6e251bWJlcjpufSx4OntudW1iZXI6bn0seTp7bnVtYmVyOm59LF9fdHlwZV9fOntvYmplY3Q6cyxib29sZWFuOm99fSxzaGFwZTp7c3RyaW5nOlsiZWxsaXBzZSIsImNpcmNsZSIsImRhdGFiYXNlIiwiYm94IiwidGV4dCIsImltYWdlIiwiY2lyY3VsYXJJbWFnZSIsImRpYW1vbmQiLCJkb3QiLCJzdGFyIiwidHJpYW5nbGUiLCJ0cmlhbmdsZURvd24iLCJzcXVhcmUiLCJpY29uIl19LHNoYXBlUHJvcGVydGllczp7Ym9yZGVyRGFzaGVzOntib29sZWFuOm8sYXJyYXk6ImFycmF5In0sYm9yZGVyUmFkaXVzOntudW1iZXI6bn0saW50ZXJwb2xhdGlvbjp7Ym9vbGVhbjpvfSx1c2VJbWFnZVNpemU6e2Jvb2xlYW46b30sdXNlQm9yZGVyV2l0aEltYWdlOntib29sZWFuOm99LF9fdHlwZV9fOntvYmplY3Q6c319LHNpemU6e251bWJlcjpufSx0aXRsZTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx2YWx1ZTp7bnVtYmVyOm4sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx3aWR0aENvbnN0cmFpbnQ6e21pbmltdW06e251bWJlcjpufSxtYXhpbXVtOntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpzLGJvb2xlYW46byxudW1iZXI6bn19LHg6e251bWJlcjpufSx5OntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpzfX0scGh5c2ljczp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxiYXJuZXNIdXQ6e2dyYXZpdGF0aW9uYWxDb25zdGFudDp7bnVtYmVyOm59LGNlbnRyYWxHcmF2aXR5OntudW1iZXI6bn0sc3ByaW5nTGVuZ3RoOntudW1iZXI6bn0sc3ByaW5nQ29uc3RhbnQ6e251bWJlcjpufSxkYW1waW5nOntudW1iZXI6bn0sYXZvaWRPdmVybGFwOntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpzfX0sZm9yY2VBdGxhczJCYXNlZDp7Z3Jhdml0YXRpb25hbENvbnN0YW50OntudW1iZXI6bn0sY2VudHJhbEdyYXZpdHk6e251bWJlcjpufSxzcHJpbmdMZW5ndGg6e251bWJlcjpufSxzcHJpbmdDb25zdGFudDp7bnVtYmVyOm59LGRhbXBpbmc6e251bWJlcjpufSxhdm9pZE92ZXJsYXA6e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxyZXB1bHNpb246e2NlbnRyYWxHcmF2aXR5OntudW1iZXI6bn0sc3ByaW5nTGVuZ3RoOntudW1iZXI6bn0sc3ByaW5nQ29uc3RhbnQ6e251bWJlcjpufSxub2RlRGlzdGFuY2U6e251bWJlcjpufSxkYW1waW5nOntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpzfX0saGllcmFyY2hpY2FsUmVwdWxzaW9uOntjZW50cmFsR3Jhdml0eTp7bnVtYmVyOm59LHNwcmluZ0xlbmd0aDp7bnVtYmVyOm59LHNwcmluZ0NvbnN0YW50OntudW1iZXI6bn0sbm9kZURpc3RhbmNlOntudW1iZXI6bn0sZGFtcGluZzp7bnVtYmVyOm59LF9fdHlwZV9fOntvYmplY3Q6c319LG1heFZlbG9jaXR5OntudW1iZXI6bn0sbWluVmVsb2NpdHk6e251bWJlcjpufSxzb2x2ZXI6e3N0cmluZzpbImJhcm5lc0h1dCIsInJlcHVsc2lvbiIsImhpZXJhcmNoaWNhbFJlcHVsc2lvbiIsImZvcmNlQXRsYXMyQmFzZWQiXX0sc3RhYmlsaXphdGlvbjp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxpdGVyYXRpb25zOntudW1iZXI6bn0sdXBkYXRlSW50ZXJ2YWw6e251bWJlcjpufSxvbmx5RHluYW1pY0VkZ2VzOntib29sZWFuOm99LGZpdDp7Ym9vbGVhbjpvfSxfX3R5cGVfXzp7b2JqZWN0OnMsYm9vbGVhbjpvfX0sdGltZXN0ZXA6e251bWJlcjpufSxhZGFwdGl2ZVRpbWVzdGVwOntib29sZWFuOm99LF9fdHlwZV9fOntvYmplY3Q6cyxib29sZWFuOm99fSxhdXRvUmVzaXplOntib29sZWFuOm99LGNsaWNrVG9Vc2U6e2Jvb2xlYW46b30sbG9jYWxlOntzdHJpbmc6aX0sbG9jYWxlczp7X19hbnlfXzp7YW55OiJhbnkifSxfX3R5cGVfXzp7b2JqZWN0OnN9fSxoZWlnaHQ6e3N0cmluZzppfSx3aWR0aDp7c3RyaW5nOml9LF9fdHlwZV9fOntvYmplY3Q6c319O3IuZ3JvdXBzLl9fYW55X189ci5ub2RlcyxyLm1hbmlwdWxhdGlvbi5jb250cm9sTm9kZVN0eWxlPXIubm9kZXM7dmFyIGE9e25vZGVzOntib3JkZXJXaWR0aDpbMSwwLDEwLDFdLGJvcmRlcldpZHRoU2VsZWN0ZWQ6WzIsMCwxMCwxXSxjb2xvcjp7Ym9yZGVyOlsiY29sb3IiLCIjMkI3Q0U5Il0sYmFja2dyb3VuZDpbImNvbG9yIiwiIzk3QzJGQyJdLGhpZ2hsaWdodDp7Ym9yZGVyOlsiY29sb3IiLCIjMkI3Q0U5Il0sYmFja2dyb3VuZDpbImNvbG9yIiwiI0QyRTVGRiJdfSxob3Zlcjp7Ym9yZGVyOlsiY29sb3IiLCIjMkI3Q0U5Il0sYmFja2dyb3VuZDpbImNvbG9yIiwiI0QyRTVGRiJdfX0sZml4ZWQ6e3g6ITEseTohMX0sZm9udDp7Y29sb3I6WyJjb2xvciIsIiMzNDM0MzQiXSxzaXplOlsxNCwwLDEwMCwxXSxmYWNlOlsiYXJpYWwiLCJ2ZXJkYW5hIiwidGFob21hIl0sYmFja2dyb3VuZDpbImNvbG9yIiwibm9uZSJdLHN0cm9rZVdpZHRoOlswLDAsNTAsMV0sc3Ryb2tlQ29sb3I6WyJjb2xvciIsIiNmZmZmZmYiXX0saGlkZGVuOiExLGxhYmVsSGlnaGxpZ2h0Qm9sZDohMCxwaHlzaWNzOiEwLHNjYWxpbmc6e21pbjpbMTAsMCwyMDAsMV0sbWF4OlszMCwwLDIwMCwxXSxsYWJlbDp7ZW5hYmxlZDohMSxtaW46WzE0LDAsMjAwLDFdLG1heDpbMzAsMCwyMDAsMV0sbWF4VmlzaWJsZTpbMzAsMCwyMDAsMV0sZHJhd1RocmVzaG9sZDpbNSwwLDIwLDFdfX0sc2hhZG93OntlbmFibGVkOiExLGNvbG9yOiJyZ2JhKDAsMCwwLDAuNSkiLHNpemU6WzEwLDAsMjAsMV0seDpbNSwtMzAsMzAsMV0seTpbNSwtMzAsMzAsMV19LHNoYXBlOlsiZWxsaXBzZSIsImJveCIsImNpcmNsZSIsImRhdGFiYXNlIiwiZGlhbW9uZCIsImRvdCIsInNxdWFyZSIsInN0YXIiLCJ0ZXh0IiwidHJpYW5nbGUiLCJ0cmlhbmdsZURvd24iXSxzaGFwZVByb3BlcnRpZXM6e2JvcmRlckRhc2hlczohMSxib3JkZXJSYWRpdXM6WzYsMCwyMCwxXSxpbnRlcnBvbGF0aW9uOiEwLHVzZUltYWdlU2l6ZTohMX0sc2l6ZTpbMjUsMCwyMDAsMV19LGVkZ2VzOnthcnJvd3M6e3RvOntlbmFibGVkOiExLHNjYWxlRmFjdG9yOlsxLDAsMywuMDVdLHR5cGU6ImFycm93In0sbWlkZGxlOntlbmFibGVkOiExLHNjYWxlRmFjdG9yOlsxLDAsMywuMDVdLHR5cGU6ImFycm93In0sZnJvbTp7ZW5hYmxlZDohMSxzY2FsZUZhY3RvcjpbMSwwLDMsLjA1XSx0eXBlOiJhcnJvdyJ9fSxhcnJvd1N0cmlrZXRocm91Z2g6ITAsY29sb3I6e2NvbG9yOlsiY29sb3IiLCIjODQ4NDg0Il0saGlnaGxpZ2h0OlsiY29sb3IiLCIjODQ4NDg0Il0saG92ZXI6WyJjb2xvciIsIiM4NDg0ODQiXSxpbmhlcml0OlsiZnJvbSIsInRvIiwiYm90aCIsITAsITFdLG9wYWNpdHk6WzEsMCwxLC4wNV19LGRhc2hlczohMSxmb250Ontjb2xvcjpbImNvbG9yIiwiIzM0MzQzNCJdLHNpemU6WzE0LDAsMTAwLDFdLGZhY2U6WyJhcmlhbCIsInZlcmRhbmEiLCJ0YWhvbWEiXSxiYWNrZ3JvdW5kOlsiY29sb3IiLCJub25lIl0sc3Ryb2tlV2lkdGg6WzIsMCw1MCwxXSxzdHJva2VDb2xvcjpbImNvbG9yIiwiI2ZmZmZmZiJdLGFsaWduOlsiaG9yaXpvbnRhbCIsInRvcCIsIm1pZGRsZSIsImJvdHRvbSJdfSxoaWRkZW46ITEsaG92ZXJXaWR0aDpbMS41LDAsNSwuMV0sbGFiZWxIaWdobGlnaHRCb2xkOiEwLHBoeXNpY3M6ITAsc2NhbGluZzp7bWluOlsxLDAsMTAwLDFdLG1heDpbMTUsMCwxMDAsMV0sbGFiZWw6e2VuYWJsZWQ6ITAsbWluOlsxNCwwLDIwMCwxXSxtYXg6WzMwLDAsMjAwLDFdLG1heFZpc2libGU6WzMwLDAsMjAwLDFdLGRyYXdUaHJlc2hvbGQ6WzUsMCwyMCwxXX19LHNlbGVjdGlvbldpZHRoOlsxLjUsMCw1LC4xXSxzZWxmUmVmZXJlbmNlU2l6ZTpbMjAsMCwyMDAsMV0sc2hhZG93OntlbmFibGVkOiExLGNvbG9yOiJyZ2JhKDAsMCwwLDAuNSkiLHNpemU6WzEwLDAsMjAsMV0seDpbNSwtMzAsMzAsMV0seTpbNSwtMzAsMzAsMV19LHNtb290aDp7ZW5hYmxlZDohMCx0eXBlOlsiZHluYW1pYyIsImNvbnRpbnVvdXMiLCJkaXNjcmV0ZSIsImRpYWdvbmFsQ3Jvc3MiLCJzdHJhaWdodENyb3NzIiwiaG9yaXpvbnRhbCIsInZlcnRpY2FsIiwiY3VydmVkQ1ciLCJjdXJ2ZWRDQ1ciLCJjdWJpY0JlemllciJdLGZvcmNlRGlyZWN0aW9uOlsiaG9yaXpvbnRhbCIsInZlcnRpY2FsIiwibm9uZSJdLHJvdW5kbmVzczpbLjUsMCwxLC4wNV19LHdpZHRoOlsxLDAsMzAsMV19LGxheW91dDp7aGllcmFyY2hpY2FsOntlbmFibGVkOiExLGxldmVsU2VwYXJhdGlvbjpbMTUwLDIwLDUwMCw1XSxub2RlU3BhY2luZzpbMTAwLDIwLDUwMCw1XSx0cmVlU3BhY2luZzpbMjAwLDIwLDUwMCw1XSxibG9ja1NoaWZ0aW5nOiEwLGVkZ2VNaW5pbWl6YXRpb246ITAscGFyZW50Q2VudHJhbGl6YXRpb246ITAsZGlyZWN0aW9uOlsiVUQiLCJEVSIsIkxSIiwiUkwiXSxzb3J0TWV0aG9kOlsiaHVic2l6ZSIsImRpcmVjdGVkIl19fSxpbnRlcmFjdGlvbjp7ZHJhZ05vZGVzOiEwLGRyYWdWaWV3OiEwLGhpZGVFZGdlc09uRHJhZzohMSxoaWRlTm9kZXNPbkRyYWc6ITEsaG92ZXI6ITEsa2V5Ym9hcmQ6e2VuYWJsZWQ6ITEsc3BlZWQ6e3g6WzEwLDAsNDAsMV0seTpbMTAsMCw0MCwxXSx6b29tOlsuMDIsMCwuMSwuMDA1XX0sYmluZFRvV2luZG93OiEwfSxtdWx0aXNlbGVjdDohMSxuYXZpZ2F0aW9uQnV0dG9uczohMSxzZWxlY3RhYmxlOiEwLHNlbGVjdENvbm5lY3RlZEVkZ2VzOiEwLGhvdmVyQ29ubmVjdGVkRWRnZXM6ITAsdG9vbHRpcERlbGF5OlszMDAsMCwxZTMsMjVdLHpvb21WaWV3OiEwfSxtYW5pcHVsYXRpb246e2VuYWJsZWQ6ITEsaW5pdGlhbGx5QWN0aXZlOiExfSxwaHlzaWNzOntlbmFibGVkOiEwLGJhcm5lc0h1dDp7Z3Jhdml0YXRpb25hbENvbnN0YW50OlstMmUzLC0zZTQsMCw1MF0sY2VudHJhbEdyYXZpdHk6Wy4zLDAsMTAsLjA1XSxzcHJpbmdMZW5ndGg6Wzk1LDAsNTAwLDVdLHNwcmluZ0NvbnN0YW50OlsuMDQsMCwxLjIsLjAwNV0sZGFtcGluZzpbLjA5LDAsMSwuMDFdLGF2b2lkT3ZlcmxhcDpbMCwwLDEsLjAxXX0sZm9yY2VBdGxhczJCYXNlZDp7Z3Jhdml0YXRpb25hbENvbnN0YW50OlstNTAsLTUwMCwwLDFdLGNlbnRyYWxHcmF2aXR5OlsuMDEsMCwxLC4wMDVdLHNwcmluZ0xlbmd0aDpbOTUsMCw1MDAsNV0sc3ByaW5nQ29uc3RhbnQ6Wy4wOCwwLDEuMiwuMDA1XSxkYW1waW5nOlsuNCwwLDEsLjAxXSxhdm9pZE92ZXJsYXA6WzAsMCwxLC4wMV19LHJlcHVsc2lvbjp7Y2VudHJhbEdyYXZpdHk6Wy4yLDAsMTAsLjA1XSxzcHJpbmdMZW5ndGg6WzIwMCwwLDUwMCw1XSxzcHJpbmdDb25zdGFudDpbLjA1LDAsMS4yLC4wMDVdLG5vZGVEaXN0YW5jZTpbMTAwLDAsNTAwLDVdLGRhbXBpbmc6Wy4wOSwwLDEsLjAxXX0saGllcmFyY2hpY2FsUmVwdWxzaW9uOntjZW50cmFsR3Jhdml0eTpbLjIsMCwxMCwuMDVdLHNwcmluZ0xlbmd0aDpbMTAwLDAsNTAwLDVdLHNwcmluZ0NvbnN0YW50OlsuMDEsMCwxLjIsLjAwNV0sbm9kZURpc3RhbmNlOlsxMjAsMCw1MDAsNV0sZGFtcGluZzpbLjA5LDAsMSwuMDFdfSxtYXhWZWxvY2l0eTpbNTAsMCwxNTAsMV0sbWluVmVsb2NpdHk6Wy4xLC4wMSwuNSwuMDFdLHNvbHZlcjpbImJhcm5lc0h1dCIsImZvcmNlQXRsYXMyQmFzZWQiLCJyZXB1bHNpb24iLCJoaWVyYXJjaGljYWxSZXB1bHNpb24iXSx0aW1lc3RlcDpbLjUsLjAxLDEsLjAxXX19O2UuYWxsT3B0aW9ucz1yLGUuY29uZmlndXJlT3B0aW9ucz1hfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMTcwKSxzPW8obikscj1pKDEzNCksYT1vKHIpLGg9aSgxMzUpLGQ9byhoKSxsPWkoMjMxKSx1PW8obCksYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8peygwLGEuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLnNwcmluZ0xlbmd0aD1pLHRoaXMuc3ByaW5nQ29uc3RhbnQ9byx0aGlzLmRpc3RhbmNlU29sdmVyPW5ldyB1LmRlZmF1bHR9cmV0dXJuKDAsZC5kZWZhdWx0KSh0LFt7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodC5zcHJpbmdMZW5ndGgmJih0aGlzLnNwcmluZ0xlbmd0aD10LnNwcmluZ0xlbmd0aCksdC5zcHJpbmdDb25zdGFudCYmKHRoaXMuc3ByaW5nQ29uc3RhbnQ9dC5zcHJpbmdDb25zdGFudCkpfX0se2tleToic29sdmUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxvPXRoaXMuZGlzdGFuY2VTb2x2ZXIuZ2V0RGlzdGFuY2VzKHRoaXMuYm9keSx0LGUpO3RoaXMuX2NyZWF0ZUxfbWF0cml4KG8pLHRoaXMuX2NyZWF0ZUtfbWF0cml4KG8pLHRoaXMuX2NyZWF0ZUVfbWF0cml4KCk7Zm9yKHZhciBuPTAscj1NYXRoLm1heCgxZTMsTWF0aC5taW4oMTAqdGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aCw2ZTMpKSxhPTFlOSxoPTAsZD0wLGw9MCx1PTAsYz0wO2E+LjAxJiZuPHI7KXtuKz0xO3ZhciBwPXRoaXMuX2dldEhpZ2hlc3RFbmVyZ3lOb2RlKGkpLGY9KDAscy5kZWZhdWx0KShwLDQpO2ZvcihoPWZbMF0sYT1mWzFdLGQ9ZlsyXSxsPWZbM10sdT1hLGM9MDt1PjEmJmM8NTspe2MrPTEsdGhpcy5fbW92ZU5vZGUoaCxkLGwpO3ZhciBtPXRoaXMuX2dldEVuZXJneShoKSx2PSgwLHMuZGVmYXVsdCkobSwzKTt1PXZbMF0sZD12WzFdLGw9dlsyXX19fX0se2tleToiX2dldEhpZ2hlc3RFbmVyZ3lOb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGk9dGhpcy5ib2R5Lm5vZGVzLG89MCxuPWVbMF0scj0wLGE9MCxoPTA7aDxlLmxlbmd0aDtoKyspe3ZhciBkPWVbaF07aWYoITE9PT1pW2RdLnByZWRlZmluZWRQb3NpdGlvbnx8ITA9PT1pW2RdLmlzQ2x1c3RlciYmITA9PT10fHwhMD09PWlbZF0ub3B0aW9ucy5maXhlZC54fHwhMD09PWlbZF0ub3B0aW9ucy5maXhlZC55KXt2YXIgbD10aGlzLl9nZXRFbmVyZ3koZCksdT0oMCxzLmRlZmF1bHQpKGwsMyksYz11WzBdLHA9dVsxXSxmPXVbMl07bzxjJiYobz1jLG49ZCxyPXAsYT1mKX19cmV0dXJuW24sbyxyLGFdfX0se2tleToiX2dldEVuZXJneSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9KDAscy5kZWZhdWx0KSh0aGlzLkVfc3Vtc1t0XSwyKSxpPWVbMF0sbz1lWzFdO3JldHVybltNYXRoLnNxcnQoTWF0aC5wb3coaSwyKStNYXRoLnBvdyhvLDIpKSxpLG9dfX0se2tleToiX21vdmVOb2RlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBvPXRoaXMuYm9keS5ub2RlSW5kaWNlcyxuPXRoaXMuYm9keS5ub2RlcyxzPTAscj0wLGE9MCxoPW5bdF0ueCxkPW5bdF0ueSxsPXRoaXMuS19tYXRyaXhbdF0sdT10aGlzLkxfbWF0cml4W3RdLGM9MDtjPG8ubGVuZ3RoO2MrKyl7dmFyIHA9b1tjXTtpZihwIT09dCl7dmFyIGY9bltwXS54LG09bltwXS55LHY9bFtwXSxnPXVbcF0seT0xL01hdGgucG93KE1hdGgucG93KGgtZiwyKStNYXRoLnBvdyhkLW0sMiksMS41KTtzKz12KigxLWcqTWF0aC5wb3coZC1tLDIpKnkpLHIrPXYqKGcqKGgtZikqKGQtbSkqeSksYSs9diooMS1nKk1hdGgucG93KGgtZiwyKSp5KX19dmFyIGI9cyxfPXIsdz1lLHg9YSxrPWksTT0ody9iK2svXykvKF8vYi14L18pLFM9LShfKk0rdykvYjtuW3RdLngrPVMsblt0XS55Kz1NLHRoaXMuX3VwZGF0ZUVfbWF0cml4KHQpfX0se2tleToiX2NyZWF0ZUxfbWF0cml4Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmJvZHkubm9kZUluZGljZXMsaT10aGlzLnNwcmluZ0xlbmd0aDt0aGlzLkxfbWF0cml4PVtdO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKXt0aGlzLkxfbWF0cml4W2Vbb11dPXt9O2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRoaXMuTF9tYXRyaXhbZVtvXV1bZVtuXV09aSp0W2Vbb11dW2Vbbl1dfX19LHtrZXk6Il9jcmVhdGVLX21hdHJpeCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGk9dGhpcy5zcHJpbmdDb25zdGFudDt0aGlzLktfbWF0cml4PVtdO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKXt0aGlzLktfbWF0cml4W2Vbb11dPXt9O2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRoaXMuS19tYXRyaXhbZVtvXV1bZVtuXV09aSpNYXRoLnBvdyh0W2Vbb11dW2Vbbl1dLC0yKX19fSx7a2V5OiJfY3JlYXRlRV9tYXRyaXgiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGU9dGhpcy5ib2R5Lm5vZGVzO3RoaXMuRV9tYXRyaXg9e30sdGhpcy5FX3N1bXM9e307Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspdGhpcy5FX21hdHJpeFt0W2ldXT1bXTtmb3IodmFyIG89MDtvPHQubGVuZ3RoO28rKyl7Zm9yKHZhciBuPXRbb10scz1lW25dLngscj1lW25dLnksYT0wLGg9MCxkPW87ZDx0Lmxlbmd0aDtkKyspe3ZhciBsPXRbZF07aWYobCE9PW4pe3ZhciB1PWVbbF0ueCxjPWVbbF0ueSxwPTEvTWF0aC5zcXJ0KE1hdGgucG93KHMtdSwyKStNYXRoLnBvdyhyLWMsMikpO3RoaXMuRV9tYXRyaXhbbl1bZF09W3RoaXMuS19tYXRyaXhbbl1bbF0qKHMtdS10aGlzLkxfbWF0cml4W25dW2xdKihzLXUpKnApLHRoaXMuS19tYXRyaXhbbl1bbF0qKHItYy10aGlzLkxfbWF0cml4W25dW2xdKihyLWMpKnApXSx0aGlzLkVfbWF0cml4W2xdW29dPXRoaXMuRV9tYXRyaXhbbl1bZF0sYSs9dGhpcy5FX21hdHJpeFtuXVtkXVswXSxoKz10aGlzLkVfbWF0cml4W25dW2RdWzFdfX10aGlzLkVfc3Vtc1tuXT1bYSxoXX19fSx7a2V5OiJfdXBkYXRlRV9tYXRyaXgiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmJvZHkubm9kZUluZGljZXMsaT10aGlzLmJvZHkubm9kZXMsbz10aGlzLkVfbWF0cml4W3RdLG49dGhpcy5LX21hdHJpeFt0XSxzPXRoaXMuTF9tYXRyaXhbdF0scj1pW3RdLngsYT1pW3RdLnksaD0wLGQ9MCxsPTA7bDxlLmxlbmd0aDtsKyspe3ZhciB1PWVbbF07aWYodSE9PXQpe3ZhciBjPW9bbF0scD1jWzBdLGY9Y1sxXSxtPWlbdV0ueCx2PWlbdV0ueSxnPTEvTWF0aC5zcXJ0KE1hdGgucG93KHItbSwyKStNYXRoLnBvdyhhLXYsMikpLHk9blt1XSooci1tLXNbdV0qKHItbSkqZyksYj1uW3VdKihhLXYtc1t1XSooYS12KSpnKTtvW2xdPVt5LGJdLGgrPXksZCs9Yjt2YXIgXz10aGlzLkVfc3Vtc1t1XTtfWzBdKz15LXAsX1sxXSs9Yi1mfX10aGlzLkVfc3Vtc1t0XT1baCxkXX19XSksdH0oKTtlLmRlZmF1bHQ9Y30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1pKDEzNCkscz1vKG4pLHI9aSgxMzUpLGE9byhyKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeygwLHMuZGVmYXVsdCkodGhpcyx0KX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6ImdldERpc3RhbmNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbz17fSxuPXQuZWRnZXMscz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgcj1lW3NdLGE9e307b1tyXT1hO2Zvcih2YXIgaD0wO2g8ZS5sZW5ndGg7aCsrKWFbZVtoXV09cz09aD8wOjFlOX1mb3IodmFyIGQ9MDtkPGkubGVuZ3RoO2QrKyl7dmFyIGw9bltpW2RdXTshMD09PWwuY29ubmVjdGVkJiZ2b2lkIDAhPT1vW2wuZnJvbUlkXSYmdm9pZCAwIT09b1tsLnRvSWRdJiYob1tsLmZyb21JZF1bbC50b0lkXT0xLG9bbC50b0lkXVtsLmZyb21JZF09MSl9Zm9yKHZhciB1PWUubGVuZ3RoLGM9MDtjPHU7YysrKWZvcih2YXIgcD1lW2NdLGY9b1twXSxtPTA7bTx1LTE7bSsrKWZvcih2YXIgdj1lW21dLGc9b1t2XSx5PW0rMTt5PHU7eSsrKXt2YXIgYj1lW3ldLF89b1tiXSx3PU1hdGgubWluKGdbYl0sZ1twXStmW2JdKTtnW2JdPXcsX1t2XT13fXJldHVybiBvfX1dKSx0fSgpO2UuZGVmYXVsdD1ofV0pfSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXZpcy5tYXAK"></script>
<script src="data:application/x-javascript;base64,Ly8gQWRkIHNoaW0gZm9yIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKCkgZnJvbToNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vYmluZCNDb21wYXRpYmlsaXR5DQovLyBmb3IgZml4IHNvbWUgUlN0dWRpbyB2aWV3ZXIgYnVnIChEZXNrdG9wIC8gd2luZG93cykNCmlmICghRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQpIHsNCiAgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAob1RoaXMpIHsNCiAgICBpZiAodHlwZW9mIHRoaXMgIT09ICJmdW5jdGlvbiIpIHsNCiAgICAgIC8vIGNsb3Nlc3QgdGhpbmcgcG9zc2libGUgdG8gdGhlIEVDTUFTY3JpcHQgNSBpbnRlcm5hbCBJc0NhbGxhYmxlIGZ1bmN0aW9uDQogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAtIHdoYXQgaXMgdHJ5aW5nIHRvIGJlIGJvdW5kIGlzIG5vdCBjYWxsYWJsZSIpOw0KICAgIH0NCiAgICANCiAgICB2YXIgYUFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLA0KICAgIGZUb0JpbmQgPSB0aGlzLA0KICAgIGZOT1AgPSBmdW5jdGlvbiAoKSB7fSwNCiAgICBmQm91bmQgPSBmdW5jdGlvbiAoKSB7DQogICAgICByZXR1cm4gZlRvQmluZC5hcHBseSh0aGlzIGluc3RhbmNlb2YgZk5PUCAmJiBvVGhpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzDQogICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9UaGlzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYUFyZ3MuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTsNCiAgICB9Ow0KICAgIA0KICAgIGZOT1AucHJvdG90eXBlID0gdGhpcy5wcm90b3R5cGU7DQogICAgZkJvdW5kLnByb3RvdHlwZSA9IG5ldyBmTk9QKCk7DQogICAgDQogICAgcmV0dXJuIGZCb3VuZDsNCiAgfTsNCn0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gZnVuY3Rpb25zIHRvIHJlc2V0IGVkZ2VzIGFmdGVyIGhhcmQgdG8gcmVhZA0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQovLyBmb3IgZWRnZXMNCmZ1bmN0aW9uIGVkZ2VBc0hhcmRUb1JlYWQoZWRnZSwgaGlkZUNvbG9yMSwgaGlkZUNvbG9yMiwgbmV0d29yaywgdHlwZSl7DQogIC8vY29uc29sZS5pbmZvKCJlZGdlQXNIYXJkVG9SZWFkIikNCiAgDQogIGlmKHR5cGUgPT09ICJlZGdlIil7DQogICAgLy9jb25zb2xlLmluZm8oImVkZ2UiKQ0KICAgIC8vY29uc29sZS5pbmZvKGVkZ2UuaWQpDQogICAgDQogICAgLy8gc2F2aW5nIGNvbG9yIGluZm9ybWF0aW9uIChpZiB3ZSBoYXZlKQ0KICAgIGlmIChlZGdlLmhpZGRlbkNvbG9yID09PSB1bmRlZmluZWQgJiYgZWRnZS5jb2xvciAhPT0gaGlkZUNvbG9yMSAmJiBlZGdlLmNvbG9yICE9PSBoaWRlQ29sb3IyKSB7DQogICAgICBlZGdlLmhpZGRlbkNvbG9yID0gZWRnZS5jb2xvcjsNCiAgICB9DQogICAgLy8gc2V0ICJoYXJkIHRvIHJlYWQiIGNvbG9yDQogICAgZWRnZS5jb2xvciA9IGhpZGVDb2xvcjE7DQogICAgDQogICAgLy8gcmVzZXQgYW5kIHNhdmUgbGFiZWwNCiAgICBpZiAoZWRnZS5oaWRkZW5MYWJlbCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICBlZGdlLmhpZGRlbkxhYmVsID0gZWRnZS5sYWJlbDsNCiAgICAgIGVkZ2UubGFiZWwgPSB1bmRlZmluZWQ7DQogICAgfQ0KICAgIGVkZ2UuaXNIYXJkVG9SZWFkID0gdHJ1ZTsNCiAgfSBlbHNlIHsNCiAgICAvL2NvbnNvbGUuaW5mbygiY2x1c3RlciIpDQogICAgLy9jb25zb2xlLmluZm8oZWRnZS5pZCkNCiAgICAvL2NvbnNvbGUuaW5mbyhlZGdlKQ0KICAgIC8vIHNhdmluZyBjb2xvciBpbmZvcm1hdGlvbiAoaWYgd2UgaGF2ZSkNCiAgICBpZiAoZWRnZS5oaWRkZW5Db2xvciA9PT0gdW5kZWZpbmVkICYmIGVkZ2UuY29sb3IgIT09IGhpZGVDb2xvcjEgJiYgZWRnZS5jb2xvciAhPT0gaGlkZUNvbG9yMikgew0KICAgICAgLy9uZXR3b3JrLmNsdXN0ZXJpbmcudXBkYXRlRWRnZShlZGdlLmlkLCB7aGlkZGVuQ29sb3IgOiBlZGdlLmNvbG9yfSk7DQogICAgICBlZGdlLmhpZGRlbkNvbG9yID0gZWRnZS5jb2xvcjsNCiAgICB9DQogICAgbmV0d29yay5jbHVzdGVyaW5nLnVwZGF0ZUVkZ2UoZWRnZS5pZCwge2NvbG9yIDogaGlkZUNvbG9yMX0pOw0KICAgIC8vZWRnZS5jb2xvciA9IGhpZGVDb2xvcjE7DQogICAgLy8gcmVzZXQgYW5kIHNhdmUgbGFiZWwNCiAgICBpZiAoZWRnZS5oaWRkZW5MYWJlbCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICBlZGdlLmhpZGRlbkxhYmVsID0gZWRnZS5sYWJlbDsNCiAgICAgIGVkZ2UubGFiZWwgPSB1bmRlZmluZWQ7DQogICAgfQ0KICAgIGVkZ2UuaXNIYXJkVG9SZWFkID0gdHJ1ZTsNCiAgfQ0KDQp9DQoNCmZ1bmN0aW9uIHJlc2V0T25lRWRnZShlZGdlLCBoaWRlQ29sb3IxLCBoaWRlQ29sb3IyLCB0eXBlKXsNCiAgDQogIC8qY29uc29sZS5pbmZvKCJyZXNldE9uZUVkZ2UiKQ0KICBjb25zb2xlLmluZm8odHlwZSkNCiAgY29uc29sZS5pbmZvKGVkZ2UuaWQpIA0KICBjb25zb2xlLmluZm8oZWRnZSkNCiAgY29uc29sZS5pbmZvKCJlZGdlLmhpZGRlbkNvbG9yIikNCiAgY29uc29sZS5pbmZvKGVkZ2UuaGlkZGVuQ29sb3IpKi8NCiAgDQogIHZhciB0cmVhdF9lZ2RlID0gZmFsc2U7DQogIGlmKHR5cGUgPT09ICJjbHVzdGVyIil7DQogICAgaWYoZWRnZS5pc0hhcmRUb1JlYWQgIT09IHVuZGVmaW5lZCl7IC8vIHdlIGhhdmUgdG8gcmVzZXQgdGhpcyBub2RlDQogICAgICBpZihlZGdlLmlzSGFyZFRvUmVhZCl7DQogICAgICAgIHRyZWF0X2VnZGUgPSB0cnVlOw0KICAgICAgfSBlbHNlIGlmKGVkZ2UuaXNIYXJkVG9SZWFkID09PSBmYWxzZSAmJiAoZWRnZS5jb2xvci5jb2xvciA9PT0gaGlkZUNvbG9yMSB8fCBlZGdlLmNvbG9yLmNvbG9yID09PSBoaWRlQ29sb3IyKSl7DQogICAgICAgIHRyZWF0X2VnZGUgPSB0cnVlOw0KICAgICAgfQ0KICAgIH0gZWxzZSBpZihlZGdlLmNvbG9yLmNvbG9yID09PSBoaWRlQ29sb3IxIHx8IGVkZ2UuY29sb3IuY29sb3IgPT09IGhpZGVDb2xvcjIpew0KICAgICAgdHJlYXRfZWdkZSA9IHRydWU7DQogICAgfQ0KICAgIA0KICAgIGlmKHRyZWF0X2VnZGUpew0KICAgICAgLy8gZ2V0IGJhY2sgY29sb3INCiAgICAgIGlmIChlZGdlLmhpZGRlbkNvbG9yICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgZWRnZS5jb2xvciA9IGVkZ2UuaGlkZGVuQ29sb3I7DQogICAgICAgIGVkZ2UuaGlkZGVuQ29sb3IgPSB1bmRlZmluZWQ7DQogICAgICB9ZWxzZXsNCiAgICAgICAgZGVsZXRlIGVkZ2UuY29sb3I7DQogICAgICB9DQogICAgICAgIA0KICAgICAgLy8gZmluYWxseSwgZ2V0IGJhY2sgbGFiZWwNCiAgICAgIGlmIChlZGdlLmhpZGRlbkxhYmVsICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgZWRnZS5sYWJlbCA9IGVkZ2UuaGlkZGVuTGFiZWw7DQogICAgICAgIGVkZ2UuaGlkZGVuTGFiZWwgPSB1bmRlZmluZWQ7DQogICAgICB9DQogICAgICBlZGdlLmlzSGFyZFRvUmVhZCA9IGZhbHNlOw0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICAvLyBnZXQgYmFjayBjb2xvcg0KICAgIGlmIChlZGdlLmhpZGRlbkNvbG9yICE9PSB1bmRlZmluZWQpIHsNCiAgICAgIGVkZ2UuY29sb3IgPSBlZGdlLmhpZGRlbkNvbG9yOw0KICAgICAgZWRnZS5oaWRkZW5Db2xvciA9IHVuZGVmaW5lZDsNCiAgICB9ZWxzZXsNCiAgICAgIGVkZ2UuY29sb3IgPSBudWxsOw0KICAgIH0NCiAgICANCiAgICAvLyBmaW5hbGx5LCBnZXQgYmFjayBsYWJlbA0KICAgIGlmIChlZGdlLmhpZGRlbkxhYmVsICE9PSB1bmRlZmluZWQpIHsNCiAgICAgIGVkZ2UubGFiZWwgPSBlZGdlLmhpZGRlbkxhYmVsOw0KICAgICAgZWRnZS5oaWRkZW5MYWJlbCA9IHVuZGVmaW5lZDsNCiAgICB9DQogICAgZWRnZS5pc0hhcmRUb1JlYWQgPSBmYWxzZTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiByZXNldEFsbEVkZ2VzKGVkZ2VzLCBoaWRlQ29sb3IxLCBoaWRlQ29sb3IyLCBuZXR3b3JrKXsNCiAgDQogIHZhciBlZGdlc1RvUmVzZXQgPSBlZGdlcy5nZXQoew0KICAgIGZpZWxkczogWydpZCcsICdjb2xvcicsICdoaWRkZW5Db2xvcicsICdsYWJlbCcsICdoaWRkZW5MYWJlbCddLA0KICAgIGZpbHRlcjogZnVuY3Rpb24gKGl0ZW0pIHsNCiAgICAgIHJldHVybiBpdGVtLmlzSGFyZFRvUmVhZCA9PT0gdHJ1ZTsNCiAgICB9LA0KICAgIHJldHVyblR5cGUgOidBcnJheScNCiAgfSk7DQoNCiAgdmFyIGlzX2NsdXN0ZXJfZWRnZXMgPSBmYWxzZTsNCiAgdmFyIGVkZ2VzX2luX2NsdXN0ZXJzOw0KICBpZihuZXR3b3JrICE9PSB1bmRlZmluZWQpew0KICAgIGVkZ2VzX2luX2NsdXN0ZXJzID0gbmV0d29yay5ib2R5Lm1vZHVsZXMuY2x1c3RlcmluZy5jbHVzdGVyZWRFZGdlczsNCiAgICBpZihPYmplY3Qua2V5cyhlZGdlc19pbl9jbHVzdGVycykubGVuZ3RoID4gMCl7DQogICAgICBpc19jbHVzdGVyX2VkZ2VzID0gdHJ1ZTsNCiAgICAgIGVkZ2VzX2luX2NsdXN0ZXJzID0gT2JqZWN0LmtleXMoZWRnZXNfaW5fY2x1c3RlcnMpOw0KICAgIH0gZWxzZSB7DQogICAgICBlZGdlc19pbl9jbHVzdGVycyA9IFtdOw0KICAgIH0NCiAgfQ0KICANCiAgdmFyIHRyZWF0X2VkZ2VzX2luX2NsdXN0ZXJzID0gW107DQogIC8vIGFsbCBlZGdlcyBnZXQgdGhlaXIgb3duIGNvbG9yIGFuZCB0aGVpciBsYWJlbCBiYWNrDQogIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXNUb1Jlc2V0Lmxlbmd0aDsgaSsrKSB7DQogICAgcmVzZXRPbmVFZGdlKGVkZ2VzVG9SZXNldFtpXSwgaGlkZUNvbG9yMSwgaGlkZUNvbG9yMix0eXBlID0gImVkZ2UiKTsNCiAgICBpZihpc19jbHVzdGVyX2VkZ2VzKXsNCiAgICAgIGlmKGluZGV4T2YuY2FsbChlZGdlc19pbl9jbHVzdGVycywgZWRnZXNUb1Jlc2V0W2ldLmlkLCB0cnVlKSA+IC0xKXsNCiAgICAgICAgdmFyIHRtcF9jbHVzdGVyX2lkID0gbmV0d29yay5jbHVzdGVyaW5nLmdldENsdXN0ZXJlZEVkZ2VzKGVkZ2VzVG9SZXNldFtpXS5pZCk7DQogICAgICAgIGlmKHRtcF9jbHVzdGVyX2lkLmxlbmd0aCA+IDEpew0KICAgICAgICAgIHRtcF9jbHVzdGVyX2lkID0gdG1wX2NsdXN0ZXJfaWRbMF07DQogICAgICAgICAgdHJlYXRfZWRnZXNfaW5fY2x1c3RlcnMucHVzaCh0bXBfY2x1c3Rlcl9pZCk7DQogICAgICAgICAgcmVzZXRPbmVFZGdlKG5ldHdvcmsuYm9keS5lZGdlc1t0bXBfY2x1c3Rlcl9pZF0ub3B0aW9ucywgaGlkZUNvbG9yMSwgaGlkZUNvbG9yMiwgdHlwZSA9ICJjbHVzdGVyIik7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCiAgDQogIC8vIHNvbWUgbWlzdW5kZXJzdG9vZCBidWcgb24gc29tZSBjbHVzdGVyIGVkZ2VzLi4uIHNvIGhhdmUgYSAoYmFkKSBmaXguLi4NCiAgdmFyIGVkZ2VzX2luX2NsdXN0ZXJzX2N0cmwgPSBlZGdlc19pbl9jbHVzdGVycy5maWx0ZXIoZnVuY3Rpb24od29yZCxpbmRleCl7DQogICAgaWYod29yZC5tYXRjaCgvXmNsdXN0ZXJFZGdlL2kpKXsNCiAgICAgIGlmKGluZGV4T2YuY2FsbCh0cmVhdF9lZGdlc19pbl9jbHVzdGVycywgd29yZCwgdHJ1ZSkgPT09IC0xKXsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICB9DQogICAgICAgIA0KICAgIH1lbHNlew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KICB9KTsNCiAgDQogIGlmKGlzX2NsdXN0ZXJfZWRnZXMpew0KICAgIGlmKGVkZ2VzX2luX2NsdXN0ZXJzX2N0cmwubGVuZ3RoID4gMCl7DQogICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlZGdlc19pbl9jbHVzdGVyc19jdHJsLmxlbmd0aDsgaisrKSB7DQogICAgICAgICBpZihuZXR3b3JrLmJvZHkuZWRnZXNbZWRnZXNfaW5fY2x1c3RlcnNfY3RybFtqXV0gIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgIHJlc2V0T25lRWRnZShuZXR3b3JrLmJvZHkuZWRnZXNbZWRnZXNfaW5fY2x1c3RlcnNfY3RybFtqXV0ub3B0aW9ucywgaGlkZUNvbG9yMSwgaGlkZUNvbG9yMiwgdHlwZSA9ICJjbHVzdGVyIik7DQogICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogIH0NCg0KICBlZGdlcy51cGRhdGUoZWRnZXNUb1Jlc2V0KTsNCn0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gZnVuY3Rpb25zIHRvIHJlc2V0IG5vZGVzIGFmdGVyIGhhcmQgdG8gcmVhZA0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQovLyBmb3IgY2xhc3NpYyBub2RlDQpmdW5jdGlvbiBzaW1wbGVSZXNldE5vZGUobm9kZSwgdHlwZSl7DQogIGlmKHR5cGUgPT09ICJub2RlIil7DQogICAgLy8gZ2V0IGJhY2sgY29sb3INCiAgICBpZiAobm9kZS5oaWRkZW5Db2xvciAhPT0gdW5kZWZpbmVkKSB7DQogICAgICBub2RlLmNvbG9yID0gbm9kZS5oaWRkZW5Db2xvcjsNCiAgICAgIG5vZGUuaGlkZGVuQ29sb3IgPSB1bmRlZmluZWQ7DQogICAgfWVsc2V7DQogICAgICBpZihub2RlLmdyb3VwICE9PSB1bmRlZmluZWQpew0KICAgICAgICBub2RlLmNvbG9yID0gdW5kZWZpbmVkOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbm9kZS5jb2xvciA9IG51bGw7DQogICAgICB9DQogICAgfQ0KICB9IGVsc2Ugew0KICAgIGlmIChPYmplY3Qua2V5cyhub2RlLm9wdGlvbnMuaGlkZGVuQ29sb3IpLmxlbmd0aCA+IDIpew0KICAgICAgbm9kZS5zZXRPcHRpb25zKHtjb2xvciA6IG5vZGUub3B0aW9ucy5oaWRkZW5Db2xvciwgaGlkZGVuQ29sb3IgOiB1bmRlZmluZWR9KTsNCiAgICB9ZWxzZXsNCiAgICAgIGlmKG5vZGUub3B0aW9ucy5ncm91cCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgbm9kZS5zZXRPcHRpb25zKHtjb2xvciA6IHVuZGVmaW5lZH0pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbm9kZS5zZXRPcHRpb25zKHtjb2xvciA6IG51bGx9KTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KLy8gZm9yIGljb24gbm9kZQ0KZnVuY3Rpb24gc2ltcGxlSWNvblJlc2V0Tm9kZShub2RlLCB0eXBlKXsNCiAgaWYodHlwZSA9PT0gIm5vZGUiKXsgIA0KICAgIC8vIGljb24gY29sb3INCiAgICBub2RlLmljb24uY29sb3IgPSBub2RlLmhpZGRlbkNvbG9yOw0KICAgIG5vZGUuaGlkZGVuQ29sb3IgPSB1bmRlZmluZWQ7DQogICAgLy8gZ2V0IGJhY2sgY29sb3INCiAgICBpZiAobm9kZS5oaWRkZW5Db2xvckZvckxhYmVsICE9PSB1bmRlZmluZWQpIHsNCiAgICAgIG5vZGUuY29sb3IgPSBub2RlLmhpZGRlbkNvbG9yRm9yTGFiZWw7DQogICAgICBub2RlLmhpZGRlbkNvbG9yRm9yTGFiZWwgPSB1bmRlZmluZWQ7DQogICAgfWVsc2V7DQogICAgICBpZihub2RlLmdyb3VwICE9PSB1bmRlZmluZWQpew0KICAgICAgICBub2RlLmNvbG9yID0gdW5kZWZpbmVkOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbm9kZS5jb2xvciA9IG51bGw7DQogICAgICB9DQogICAgfQ0KICB9IGVsc2Ugew0KICAgIG5vZGUuc2V0T3B0aW9ucyh7aWNvbiA6IHsgY29sb3IgOiBub2RlLm9wdGlvbnMuaGlkZGVuQ29sb3J9LCBoaWRkZW5Db2xvciA6IHVuZGVmaW5lZH0pOw0KICAgIGlmIChub2RlLm9wdGlvbnMuaGlkZGVuQ29sb3JGb3JMYWJlbCAhPT0gdW5kZWZpbmVkKSB7DQogICAgICBub2RlLnNldE9wdGlvbnMoe2NvbG9yIDogbm9kZS5vcHRpb25zLmhpZGRlbkNvbG9yRm9yTGFiZWwsIGhpZGRlbkNvbG9yRm9yTGFiZWwgOiB1bmRlZmluZWR9KTsNCiAgICB9ZWxzZXsNCiAgICAgIGlmKG5vZGUub3B0aW9ucy5ncm91cCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgbm9kZS5zZXRPcHRpb25zKHtjb2xvciA6IHVuZGVmaW5lZH0pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbm9kZS5zZXRPcHRpb25zKHtjb2xvciA6IG51bGx9KTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KLy8gZm9yIGltYWdlIG5vZGUNCmZ1bmN0aW9uIHNpbXBsZUltYWdlUmVzZXROb2RlKG5vZGUsIGltYWdlVHlwZSwgdHlwZSl7DQogIGlmKHR5cGUgPT09ICJub2RlIil7ICANCiAgICAvLyBnZXQgYmFjayBjb2xvcg0KICAgIGlmIChub2RlLmhpZGRlbkNvbG9yICE9PSB1bmRlZmluZWQpIHsNCiAgICAgIG5vZGUuY29sb3IgPSBub2RlLmhpZGRlbkNvbG9yOw0KICAgICAgbm9kZS5oaWRkZW5Db2xvciA9IHVuZGVmaW5lZDsNCiAgICB9ZWxzZXsNCiAgICAgIGlmKG5vZGUuZ3JvdXAgIT09IHVuZGVmaW5lZCl7DQogICAgICAgIG5vZGUuY29sb3IgPSB1bmRlZmluZWQ7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBub2RlLmNvbG9yID0gbnVsbDsNCiAgICAgIH0NCiAgICB9DQogICAgLy8gYW5kIHNldCBzaGFwZSBhcyBpbWFnZS9jaXJjdWxhckltYWdlDQogICAgbm9kZS5zaGFwZSA9IGltYWdlVHlwZTsNCiAgfSBlbHNlIHsNCiAgICBpZiAoT2JqZWN0LmtleXMobm9kZS5vcHRpb25zLmhpZGRlbkNvbG9yKS5sZW5ndGggPiAyKSB7DQogICAgICBub2RlLnNldE9wdGlvbnMoe2NvbG9yIDogbm9kZS5vcHRpb25zLmhpZGRlbkNvbG9yLCBoaWRkZW5Db2xvciA6IHVuZGVmaW5lZH0pOw0KICAgIH1lbHNlew0KICAgICAgaWYobm9kZS5vcHRpb25zLmdyb3VwICE9PSB1bmRlZmluZWQpew0KICAgICAgICBub2RlLnNldE9wdGlvbnMoe2NvbG9yIDogdW5kZWZpbmVkfSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBub2RlLnNldE9wdGlvbnMoe2NvbG9yIDogbnVsbH0pOw0KICAgICAgfQ0KICAgIH0NCiAgICBub2RlLnNldE9wdGlvbnMoe3NoYXBlIDogaW1hZ2VUeXBlfSk7DQogIH0NCn0NCg0KLy8gR2xvYmFsIGZ1bmN0aW9uIHRvIHJlc2V0IG9uZSBjbHVzdGVyDQpmdW5jdGlvbiByZXNldE9uZUNsdXN0ZXIobm9kZSwgZ3JvdXBzLCBvcHRpb25zLCBuZXR3b3JrKXsNCiAgaWYobm9kZSAhPT0gdW5kZWZpbmVkKXsNCiAgICBpZihub2RlLm9wdGlvbnMuaXNIYXJkVG9SZWFkICE9PSB1bmRlZmluZWQpeyAvLyB3ZSBoYXZlIHRvIHJlc2V0IHRoaXMgbm9kZQ0KICAgICAgaWYobm9kZS5vcHRpb25zLmlzSGFyZFRvUmVhZCl7DQogICAgICAgIHZhciBmaW5hbF9zaGFwZTsNCiAgICAgICAgdmFyIHNoYXBlX2dyb3VwID0gZmFsc2U7DQogICAgICAgIHZhciBpc19ncm91cCA9IGZhbHNlOw0KICAJICAvLyBoYXZlIGEgZ3JvdXAgaW5mb3JtYXRpb24gJiBhIHNoYXBlIGRlZmluZWQgaW4gZ3JvdXAgPw0KICAgICAgICBpZihub2RlLm9wdGlvbnMuZ3JvdXAgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgaWYoZ3JvdXBzLmdyb3Vwc1tub2RlLm9wdGlvbnMuZ3JvdXBdICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgaXNfZ3JvdXAgPSB0cnVlOw0KICAgICAgICAgICAgaWYoZ3JvdXBzLmdyb3Vwc1tub2RlLm9wdGlvbnMuZ3JvdXBdLnNoYXBlICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgICBzaGFwZV9ncm91cCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIC8vIGhhdmUgYSBnbG9iYWwgc2hhcGUgaW4gbm9kZXMgb3B0aW9ucyA/DQogICAgICAgIHZhciBzaGFwZV9vcHRpb25zID0gZmFsc2U7DQogICAgICAgIGlmKG9wdGlvbnMubm9kZXMgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgaWYob3B0aW9ucy5ub2Rlcy5zaGFwZSAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgIHNoYXBlX29wdGlvbnMgPSB0cnVlOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAvLyBzZXQgZmluYWwgc2hhcGUgKGluZGl2aWR1YWwgPiBncm91cCA+IGdsb2JhbCkNCiAgICAgICAgaWYobm9kZS5vcHRpb25zLmhpZGRlbkltYWdlICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgIGZpbmFsX3NoYXBlID0gbm9kZS5vcHRpb25zLmhpZGRlbkltYWdlOw0KICAgICAgICB9IGVsc2UgaWYobm9kZS5vcHRpb25zLnNoYXBlICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgIGZpbmFsX3NoYXBlID0gbm9kZS5vcHRpb25zLnNoYXBlOw0KICAgICAgICB9IGVsc2UgaWYoc2hhcGVfZ3JvdXApew0KICAgICAgICAgIGZpbmFsX3NoYXBlID0gZ3JvdXBzLmdyb3Vwc1tub2RlLm9wdGlvbnMuZ3JvdXBdLnNoYXBlOw0KICAgICAgICB9IGVsc2UgaWYoc2hhcGVfb3B0aW9ucyl7DQogICAgICAgICAgZmluYWxfc2hhcGUgPSBvcHRpb25zLm5vZGVzLnNoYXBlOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBub2RlLnNldE9wdGlvbnMoe2JvZHlIaWRkZW5Db2xvciA6IG5ldHdvcmsuYm9keS5ub2Rlc1tub2RlLmlkXS5vcHRpb25zLmNvbG9yfSk7DQogICAgICAgIC8vIGFuZCBjYWxsIGdvb2QgcmVzZXQgZnVuY3Rpb24NCiAgICAgICAgaWYoZmluYWxfc2hhcGUgPT09ICJpY29uIil7DQogICAgICAgICAgc2ltcGxlSWNvblJlc2V0Tm9kZShub2RlLCAiY2x1c3RlciIpOw0KICAgICAgICB9IGVsc2UgaWYoZmluYWxfc2hhcGUgPT09ICJpbWFnZSIpew0KICAgICAgICAgIHNpbXBsZUltYWdlUmVzZXROb2RlKG5vZGUsICJpbWFnZSIsICJjbHVzdGVyIik7DQogICAgICAgIH0gZWxzZSBpZihmaW5hbF9zaGFwZSA9PT0gImNpcmN1bGFySW1hZ2UiKXsNCiAgICAgICAgICBzaW1wbGVJbWFnZVJlc2V0Tm9kZShub2RlLCAiY2lyY3VsYXJJbWFnZSIsICJjbHVzdGVyIik7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgc2ltcGxlUmVzZXROb2RlKG5vZGUsICJjbHVzdGVyIik7DQogICAgICAgIH0NCiAgICAJIC8vIGZpbmFsbHksIGdldCBiYWNrIGxhYmVsDQogICAgICAgIGlmIChub2RlLm9wdGlvbnMuaGlkZGVuTGFiZWwgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgIG5vZGUuc2V0T3B0aW9ucyh7bGFiZWwgOiBub2RlLm9wdGlvbnMuaGlkZGVuTGFiZWwsIGhpZGRlbkxhYmVsIDogdW5kZWZpbmVkfSk7DQogICAgICAgIH0NCiAgICAgICAgbm9kZS5vcHRpb25zLmlzSGFyZFRvUmVhZCA9IGZhbHNlOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQovLyBHbG9iYWwgZnVuY3Rpb24gdG8gcmVzZXQgb25lIG5vZGUNCmZ1bmN0aW9uIHJlc2V0T25lTm9kZShub2RlLCBncm91cHMsIG9wdGlvbnMsIG5ldHdvcmspew0KICBpZihub2RlICE9PSB1bmRlZmluZWQpew0KICAgIGlmKG5vZGUuaXNIYXJkVG9SZWFkICE9PSB1bmRlZmluZWQpeyAvLyB3ZSBoYXZlIHRvIHJlc2V0IHRoaXMgbm9kZQ0KICAgICAgaWYobm9kZS5pc0hhcmRUb1JlYWQpew0KICAgICAgICB2YXIgZmluYWxfc2hhcGU7DQogICAgICAgIHZhciBzaGFwZV9ncm91cCA9IGZhbHNlOw0KICAgICAgICB2YXIgaXNfZ3JvdXAgPSBmYWxzZTsNCiAgCSAgLy8gaGF2ZSBhIGdyb3VwIGluZm9ybWF0aW9uICYgYSBzaGFwZSBkZWZpbmVkIGluIGdyb3VwID8NCiAgICAgICAgaWYobm9kZS5ncm91cCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICBpZihncm91cHMuZ3JvdXBzW25vZGUuZ3JvdXBdICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgaXNfZ3JvdXAgPSB0cnVlOw0KICAgICAgICAgICAgaWYoZ3JvdXBzLmdyb3Vwc1tub2RlLmdyb3VwXS5zaGFwZSAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgICAgc2hhcGVfZ3JvdXAgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAvLyBoYXZlIGEgZ2xvYmFsIHNoYXBlIGluIG5vZGVzIG9wdGlvbnMgPw0KICAgICAgICB2YXIgc2hhcGVfb3B0aW9ucyA9IGZhbHNlOw0KICAgICAgICBpZihvcHRpb25zLm5vZGVzICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgIGlmKG9wdGlvbnMubm9kZXMuc2hhcGUgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICBzaGFwZV9vcHRpb25zID0gdHJ1ZTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgLy8gc2V0IGZpbmFsIHNoYXBlIChpbmRpdmlkdWFsID4gZ3JvdXAgPiBnbG9iYWwpDQogICAgICAgIGlmKG5vZGUuaGlkZGVuSW1hZ2UgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgZmluYWxfc2hhcGUgPSBub2RlLmhpZGRlbkltYWdlOw0KICAgICAgICB9IGVsc2UgaWYobm9kZS5zaGFwZSAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICBmaW5hbF9zaGFwZSA9IG5vZGUuc2hhcGU7DQogICAgICAgIH0gZWxzZSBpZihzaGFwZV9ncm91cCl7DQogICAgICAgICAgZmluYWxfc2hhcGUgPSBncm91cHMuZ3JvdXBzW25vZGUuZ3JvdXBdLnNoYXBlOw0KICAgICAgICB9IGVsc2UgaWYoc2hhcGVfb3B0aW9ucyl7DQogICAgICAgICAgZmluYWxfc2hhcGUgPSBvcHRpb25zLm5vZGVzLnNoYXBlOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyByZXNldCBib2R5IGluZm9ybWF0aW9uDQogICAgICAgIG5ldHdvcmsuYm9keS5ub2Rlc1tub2RlLmlkXS5vcHRpb25zLmNvbG9yID0gbm9kZS5ib2R5SGlkZGVuQ29sb3I7DQoNCiAgICAgICAgLy8gYW5kIGNhbGwgZ29vZCByZXNldCBmdW5jdGlvbg0KICAgICAgICBpZihmaW5hbF9zaGFwZSA9PT0gImljb24iKXsNCiAgICAgICAgICBzaW1wbGVJY29uUmVzZXROb2RlKG5vZGUsICJub2RlIik7DQogICAgICAgIH0gZWxzZSBpZihmaW5hbF9zaGFwZSA9PT0gImltYWdlIil7DQogICAgICAgICAgc2ltcGxlSW1hZ2VSZXNldE5vZGUobm9kZSwgImltYWdlIiwgIm5vZGUiKTsNCiAgICAgICAgfSBlbHNlIGlmKGZpbmFsX3NoYXBlID09PSAiY2lyY3VsYXJJbWFnZSIpew0KICAgICAgICAgIHNpbXBsZUltYWdlUmVzZXROb2RlKG5vZGUsICJjaXJjdWxhckltYWdlIiwgIm5vZGUiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBzaW1wbGVSZXNldE5vZGUobm9kZSwgIm5vZGUiKTsNCiAgICAgICAgfQ0KICAgIAkgLy8gZmluYWxseSwgZ2V0IGJhY2sgbGFiZWwNCiAgICAJICBpZiAobm9kZS5oaWRkZW5MYWJlbCAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgbm9kZS5sYWJlbCA9IG5vZGUuaGlkZGVuTGFiZWw7DQogICAgICAgICAgbm9kZS5oaWRkZW5MYWJlbCA9IHVuZGVmaW5lZDsNCiAgICAgICAgfQ0KICAgICAgICBub2RlLmlzSGFyZFRvUmVhZCA9IGZhbHNlOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQovLyBHbG9iYWwgZnVuY3Rpb24gdG8gcmVzZXQgYWxsIG5vZGUNCmZ1bmN0aW9uIHJlc2V0QWxsTm9kZXMobm9kZXMsIHVwZGF0ZSwgZ3JvdXBzLCBvcHRpb25zLCBuZXR3b3JrKXsNCiAgdmFyIG5vZGVzVG9SZXNldCA9IG5vZGVzLmdldCh7DQogICAgZmlsdGVyOiBmdW5jdGlvbiAoaXRlbSkgew0KICAgICAgcmV0dXJuIGl0ZW0uaXNIYXJkVG9SZWFkID09PSB0cnVlOw0KICAgIH0sDQogICAgcmV0dXJuVHlwZSA6J0FycmF5Jw0KICB9KTsNCiAgDQogIHZhciBoYXZlX2NsdXN0ZXJfbm9kZXMgPSBmYWxzZTsNCiAgdmFyIG5vZGVzX2luX2NsdXN0ZXJzOw0KICBpZihuZXR3b3JrICE9PSB1bmRlZmluZWQpew0KICAgIG5vZGVzX2luX2NsdXN0ZXJzID0gbmV0d29yay5ib2R5Lm1vZHVsZXMuY2x1c3RlcmluZy5jbHVzdGVyZWROb2RlczsNCiAgICBpZihPYmplY3Qua2V5cyhub2Rlc19pbl9jbHVzdGVycykubGVuZ3RoID4gMCl7DQogICAgICBoYXZlX2NsdXN0ZXJfbm9kZXMgPSB0cnVlOw0KICAgICAgbm9kZXNfaW5fY2x1c3RlcnMgPSBPYmplY3Qua2V5cyhub2Rlc19pbl9jbHVzdGVycyk7DQogICAgfSBlbHNlIHsNCiAgICAgIG5vZGVzX2luX2NsdXN0ZXJzID0gW107DQogICAgfQ0KICB9DQoNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlc1RvUmVzZXQubGVuZ3RoOyBpKyspIHsNCiAgICByZXNldE9uZU5vZGUobm9kZXNUb1Jlc2V0W2ldLCBncm91cHMsIG9wdGlvbnMsIG5ldHdvcmssIHR5cGUgPSAibm9kZSIpOw0KCS8vIHJlc2V0IGNvb3JkaW5hdGVzDQogICAgbm9kZXNUb1Jlc2V0W2ldLnggPSB1bmRlZmluZWQ7DQogICAgbm9kZXNUb1Jlc2V0W2ldLnkgPSB1bmRlZmluZWQ7DQogICAgaWYoaGF2ZV9jbHVzdGVyX25vZGVzKXsNCiAgICAgIGlmKGluZGV4T2YuY2FsbChub2Rlc19pbl9jbHVzdGVycywgbm9kZXNUb1Jlc2V0W2ldLmlkLCB0cnVlKSA+IC0xKXsNCiAgICAgICAgdmFyIHRtcF9jbHVzdGVyX2lkID0gbmV0d29yay5jbHVzdGVyaW5nLmZpbmROb2RlKG5vZGVzVG9SZXNldFtpXS5pZCk7DQogICAgICAgIC8vIGluIGNhc2Ugb2YgbXVsdGlwbGUgY2x1c3Rlci4uLg0KICAgICAgICBmb3IodmFyIGogPSAwOyBqIDwgKHRtcF9jbHVzdGVyX2lkLmxlbmd0aC0xKTsgaisrKSB7DQogICAgICAgICAgcmVzZXRPbmVDbHVzdGVyKG5ldHdvcmsuYm9keS5ub2Rlc1t0bXBfY2x1c3Rlcl9pZFtqXV0sIGdyb3Vwcywgb3B0aW9ucywgbmV0d29yayk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCiAgaWYodXBkYXRlKXsNCiAgICBub2Rlcy51cGRhdGUobm9kZXNUb1Jlc2V0KTsNCiAgfQ0KfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBmdW5jdGlvbnMgdG8gc2V0IG5vZGVzIGFzIGhhcmQgdG8gcmVhZA0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQovLyBmb3IgY2xhc3NpYyBub2RlDQpmdW5jdGlvbiBzaW1wbGVOb2RlQXNIYXJkVG9SZWFkKG5vZGUsIGhpZGVDb2xvcjEsIGhpZGVDb2xvcjIsIHR5cGUpew0KDQoNCiAgLy8gY2xhc3NpYyBub2Rlcw0KICBpZih0eXBlID09PSAibm9kZSIpew0KICAgIC8vIHNhdmluZyBjb2xvciBpbmZvcm1hdGlvbiAoaWYgd2UgaGF2ZSkNCiAgICBpZiAobm9kZS5oaWRkZW5Db2xvciA9PT0gdW5kZWZpbmVkICYmIG5vZGUuY29sb3IgIT09IGhpZGVDb2xvcjEgJiYgbm9kZS5jb2xvciAhPT0gaGlkZUNvbG9yMikgew0KICAgICAgbm9kZS5oaWRkZW5Db2xvciA9IG5vZGUuY29sb3I7DQogICAgfQ0KICANCiAgICAvLyBzZXQgImhhcmQgdG8gcmVhZCIgY29sb3INCiAgICBub2RlLmNvbG9yID0gaGlkZUNvbG9yMTsNCiAgICAvLyByZXNldCBhbmQgc2F2ZSBsYWJlbA0KICAgIGlmIChub2RlLmhpZGRlbkxhYmVsID09PSB1bmRlZmluZWQpIHsNCiAgICAgIG5vZGUuaGlkZGVuTGFiZWwgPSBub2RlLmxhYmVsOw0KICAgICAgbm9kZS5sYWJlbCA9IHVuZGVmaW5lZDsNCiAgICB9DQogIC8vIGNsdXN0ZXIgIA0KICB9IGVsc2Ugew0KICAgIC8vIHNhdmluZyBjb2xvciBpbmZvcm1hdGlvbiAoaWYgd2UgaGF2ZSkNCiAgICBpZiAobm9kZS5vcHRpb25zLmhpZGRlbkNvbG9yID09PSB1bmRlZmluZWQgJiYgbm9kZS5vcHRpb25zLmNvbG9yICE9PSBoaWRlQ29sb3IxICYmIG5vZGUub3B0aW9ucy5jb2xvciAhPT0gaGlkZUNvbG9yMikgew0KICAgICAgbm9kZS5zZXRPcHRpb25zKHtoaWRkZW5Db2xvciA6IG5vZGUub3B0aW9ucy5jb2xvcn0pOw0KICAgIH0NCiAgICAvLyBzZXQgImhhcmQgdG8gcmVhZCIgY29sb3INCiAgICBub2RlLnNldE9wdGlvbnMoe2NvbG9yIDogaGlkZUNvbG9yMX0pOw0KICAgIC8vIHJlc2V0IGFuZCBzYXZlIGxhYmVsDQogICAgaWYgKG5vZGUub3B0aW9ucy5oaWRkZW5MYWJlbCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICBub2RlLnNldE9wdGlvbnMoe2hpZGRlbkxhYmVsIDogbm9kZS5vcHRpb25zLmxhYmVsfSk7DQogICAgICBub2RlLnNldE9wdGlvbnMoe2xhYmVsIDogdW5kZWZpbmVkfSk7DQogICAgfQ0KICB9DQp9DQoNCi8vIGZvciBpY29uIG5vZGUNCmZ1bmN0aW9uIGljb25zTm9kZUFzSGFyZFRvUmVhZChub2RlLCBoaWRlQ29sb3IxLCBoaWRlQ29sb3IyLCBpY29uX2NvbG9yLCB0eXBlKXsNCiAgLy8gY2xhc3NpYyBub2Rlcw0KICBpZih0eXBlID09PSAibm9kZSIpew0KICAgIC8vIGluZGl2aWR1YWwgaW5mb3JtYXRpb24NCiAgICBpZihub2RlLmljb24gIT09IHVuZGVmaW5lZCAmJiBub2RlLmljb24gIT09IG51bGwgJiYgbm9kZS5pY29uICE9PSB7fSl7DQogICAgICBub2RlLmljb25EZWZpbmVkID0gdHJ1ZTsNCiAgICB9IGVsc2UgeyAvLyBpbmZvcm1hdGlvbiBpbiBncm91cCA6IGhhdmUgdG8gYXMgaW5kaXZpZHVhbA0KICAgICAgbm9kZS5pY29uID0ge307DQogICAgICBub2RlLmljb25EZWZpbmVkID0gZmFsc2U7DQogICAgfQ0KICAgIC8vIHNldCAiaGFyZCB0byByZWFkIiBjb2xvcg0KICAgIG5vZGUuaWNvbi5jb2xvciA9IGhpZGVDb2xvcjE7DQogICAgbm9kZS5oaWRkZW5Db2xvciA9IGljb25fY29sb3I7DQogICAgLy8gZm9yIGVkZ2VzLi4uLnNhdmluZyBjb2xvciBpbmZvcm1hdGlvbiAoaWYgd2UgaGF2ZSkNCiAgICBpZiAobm9kZS5oaWRkZW5Db2xvckZvckxhYmVsID09PSB1bmRlZmluZWQgJiYgbm9kZS5jb2xvciAhPT0gaGlkZUNvbG9yMSAmJiBub2RlLmNvbG9yICE9PSBoaWRlQ29sb3IyKSB7DQogICAgICBub2RlLmhpZGRlbkNvbG9yRm9yTGFiZWwgPSBub2RlLmNvbG9yOw0KICAgIH0NCiAgICAvLyBzZXQgImhhcmQgdG8gcmVhZCIgY29sb3INCiAgICBub2RlLmNvbG9yID0gaGlkZUNvbG9yMTsNCiAgICAvLyByZXNldCBhbmQgc2F2ZSBsYWJlbA0KICAgIGlmIChub2RlLmhpZGRlbkxhYmVsID09PSB1bmRlZmluZWQpIHsNCiAgICAgIG5vZGUuaGlkZGVuTGFiZWwgPSBub2RlLmxhYmVsOw0KICAgICAgbm9kZS5sYWJlbCA9IHVuZGVmaW5lZDsNCiAgICB9DQogIH0gZWxzZSB7DQogICAgLy8gaW5kaXZpZHVhbCBpbmZvcm1hdGlvbg0KICAgIGlmKG5vZGUub3B0aW9ucy5pY29uICE9PSB1bmRlZmluZWQgJiYgbm9kZS5vcHRpb25zLmljb24gIT09IG51bGwgJiYgbm9kZS5vcHRpb25zLmljb24gIT09IHt9KXsNCiAgICAgIG5vZGUuc2V0T3B0aW9ucyh7aWNvbkRlZmluZWQgOiB0cnVlfSk7DQogICAgfSBlbHNlIHsgLy8gaW5mb3JtYXRpb24gaW4gZ3JvdXAgOiBoYXZlIHRvIGFzIGluZGl2aWR1YWwNCiAgICAgIG5vZGUuc2V0T3B0aW9ucyh7aWNvbkRlZmluZWQgOiBmYWxzZSwgaWNvbjp7fX0pOw0KICAgIH0NCiAgICAvLyBzZXQgImhhcmQgdG8gcmVhZCIgY29sb3INCiAgICBub2RlLnNldE9wdGlvbnMoe2hpZGRlbkNvbG9yIDogaWNvbl9jb2xvciwgaWNvbjp7Y29sb3IgOiBoaWRlQ29sb3IxfX0pOw0KICAgIC8vIGZvciBlZGdlcy4uLi5zYXZpbmcgY29sb3IgaW5mb3JtYXRpb24gKGlmIHdlIGhhdmUpDQogICAgaWYgKG5vZGUub3B0aW9ucy5oaWRkZW5Db2xvckZvckxhYmVsID09PSB1bmRlZmluZWQgJiYgbm9kZS5vcHRpb25zLmNvbG9yICE9PSBoaWRlQ29sb3IxICYmIG5vZGUub3B0aW9ucy5jb2xvciAhPT0gaGlkZUNvbG9yMikgew0KICAgICAgbm9kZS5zZXRPcHRpb25zKHtoaWRkZW5Db2xvckZvckxhYmVsIDogbm9kZS5vcHRpb25zLmNvbG9yfSk7DQogICAgfQ0KICAgIC8vIHNldCAiaGFyZCB0byByZWFkIiBjb2xvcg0KICAgIG5vZGUuc2V0T3B0aW9ucyh7Y29sb3IgOiBoaWRlQ29sb3IxfSk7DQogICAgLy8gcmVzZXQgYW5kIHNhdmUgbGFiZWwNCiAgICBpZiAobm9kZS5vcHRpb25zLmhpZGRlbkxhYmVsID09PSB1bmRlZmluZWQpIHsNCiAgICAgIG5vZGUuc2V0T3B0aW9ucyh7aGlkZGVuTGFiZWwgOiBub2RlLm9wdGlvbnMubGFiZWwsIGxhYmVsIDogdW5kZWZpbmVkfSk7DQogICAgfQ0KICB9DQp9DQoNCi8vIGZvciBpbWFnZSBub2RlDQpmdW5jdGlvbiBpbWFnZU5vZGVBc0hhcmRUb1JlYWQobm9kZSwgaW1hZ2VUeXBlLCBoaWRlQ29sb3IxLCBoaWRlQ29sb3IyLCB0eXBlKXsNCiAgLy8gY2xhc3NpYyBub2Rlcw0KICBpZih0eXBlID09PSAibm9kZSIpew0KICAgIC8vIHNhdmluZyBjb2xvciBpbmZvcm1hdGlvbiAoaWYgd2UgaGF2ZSkNCiAgICBpZiAobm9kZS5oaWRkZW5Db2xvciA9PT0gdW5kZWZpbmVkICYmIG5vZGUuY29sb3IgIT09IGhpZGVDb2xvcjEgJiYgbm9kZS5jb2xvciAhPT0gaGlkZUNvbG9yMikgew0KICAgICAgbm9kZS5oaWRkZW5Db2xvciA9IG5vZGUuY29sb3I7DQogICAgfQ0KICAgIC8vIHNldCAiaGFyZCB0byByZWFkIiBjb2xvcg0KICAgIG5vZGUuY29sb3IgPSBoaWRlQ29sb3IxOw0KICAgIC8vIHJlc2V0IGFuZCBzYXZlIGxhYmVsDQogICAgaWYgKG5vZGUuaGlkZGVuTGFiZWwgPT09IHVuZGVmaW5lZCkgew0KICAgICAgbm9kZS5oaWRkZW5MYWJlbCA9IG5vZGUubGFiZWw7DQogICAgICBub2RlLmxhYmVsID0gdW5kZWZpbmVkOw0KICAgIH0NCiAgICAvLyBrZWVwIHNoYXBlIGluZm9ybWF0aW9uLCBhbmQgc2V0IGEgbmV3DQogICAgaWYoaW1hZ2VUeXBlID09PSAiaW1hZ2UiKXsNCiAgICAgIG5vZGUuaGlkZGVuSW1hZ2UgPSBpbWFnZVR5cGU7DQogICAgICBub2RlLnNoYXBlID0gInNxdWFyZSI7DQogICAgfWVsc2UgaWYoaW1hZ2VUeXBlID09PSAiY2lyY3VsYXJJbWFnZSIpew0KICAgICAgbm9kZS5oaWRkZW5JbWFnZSA9IGltYWdlVHlwZTsNCiAgICAgIG5vZGUuc2hhcGUgPSAiZG90IjsNCiAgICB9DQogIH0gZWxzZSB7DQogICAgLy8gc2F2aW5nIGNvbG9yIGluZm9ybWF0aW9uIChpZiB3ZSBoYXZlKQ0KICAgIGlmIChub2RlLm9wdGlvbnMuaGlkZGVuQ29sb3IgPT09IHVuZGVmaW5lZCAmJiBub2RlLm9wdGlvbnMuY29sb3IgIT09IGhpZGVDb2xvcjEgJiYgbm9kZS5vcHRpb25zLmNvbG9yICE9PSBoaWRlQ29sb3IyKSB7DQogICAgICBub2RlLnNldE9wdGlvbnMoe2hpZGRlbkNvbG9yIDogbm9kZS5vcHRpb25zLmNvbG9yfSk7DQogICAgfQ0KICAgIC8vIHNldCAiaGFyZCB0byByZWFkIiBjb2xvcg0KICAgIG5vZGUuc2V0T3B0aW9ucyh7Y29sb3IgOiBoaWRlQ29sb3IxfSk7DQogICAgLy8gcmVzZXQgYW5kIHNhdmUgbGFiZWwNCiAgICBpZiAobm9kZS5vcHRpb25zLmhpZGRlbkxhYmVsID09PSB1bmRlZmluZWQpIHsNCiAgICAgIG5vZGUuc2V0T3B0aW9ucyh7aGlkZGVuTGFiZWwgOiBub2RlLm9wdGlvbnMubGFiZWwsIGxhYmVsIDogdW5kZWZpbmVkfSk7DQogICAgfQ0KICAgIGlmKGltYWdlVHlwZSA9PT0gImltYWdlIil7DQogICAgICBub2RlLnNldE9wdGlvbnMoe2hpZGRlbkltYWdlIDogImltYWdlIiwgc2hhcGUgOiAic3F1YXJlIn0pOw0KICAgIH0gZWxzZSBpZihpbWFnZVR5cGUgPT09ICJjaXJjdWxhckltYWdlIil7DQogICAgICBub2RlLnNldE9wdGlvbnMoe2hpZGRlbkltYWdlIDogImNpcmN1bGFySW1hZ2UiLCBzaGFwZSA6ICJkb3QifSk7DQogICAgfQ0KICAgIG5vZGUuaGlkZGVuSW1hZ2UgPSBpbWFnZVR5cGU7DQogIH0NCn0NCg0KLy8gR2xvYmFsIGZ1bmN0aW9uIHRvIHNldCBvbmUgbm9kZSBhcyBoYXJkIHRvIHJlYWQNCmZ1bmN0aW9uIG5vZGVBc0hhcmRUb1JlYWQobm9kZSwgZ3JvdXBzLCBvcHRpb25zLCBoaWRlQ29sb3IxLCBoaWRlQ29sb3IyLCBuZXR3b3JrLCB0eXBlKXsNCiAgdmFyIGZpbmFsX3NoYXBlOw0KICB2YXIgc2hhcGVfZ3JvdXAgPSBmYWxzZTsNCiAgdmFyIGlzX2dyb3VwID0gZmFsc2U7DQoNCiAgaWYobm9kZS5pc0hhcmRUb1JlYWQgPT09IGZhbHNlIHx8IG5vZGUuaXNIYXJkVG9SZWFkID09PSB1bmRlZmluZWQpew0KDQogICAgLy8gaGF2ZSBhIGdyb3VwIGluZm9ybWF0aW9uICYgYSBzaGFwZSBkZWZpbmVkIGluIGdyb3VwID8NCiAgICBpZihub2RlLmdyb3VwICE9PSB1bmRlZmluZWQpew0KICAgICAgaWYoZ3JvdXBzLmdyb3Vwc1tub2RlLmdyb3VwXSAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgaXNfZ3JvdXAgPSB0cnVlOw0KICAgICAgICBpZihncm91cHMuZ3JvdXBzW25vZGUuZ3JvdXBdLnNoYXBlICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgIHNoYXBlX2dyb3VwID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICAvLyBoYXZlIGEgZ3JvdXAgaW5mb3JtYXRpb24gJiBhIHNoYXBlIGRlZmluZWQgaW4gZ3JvdXAgPw0KICAgIHZhciBzaGFwZV9vcHRpb25zID0gZmFsc2U7DQogICAgaWYob3B0aW9ucy5ub2RlcyAhPT0gdW5kZWZpbmVkKXsNCiAgICAgIGlmKG9wdGlvbnMubm9kZXMuc2hhcGUgIT09IHVuZGVmaW5lZCl7DQogICAgICAgIHNoYXBlX29wdGlvbnMgPSB0cnVlOw0KICAgICAgfQ0KICAgIH0NCiAgICAvLyBzZXQgZmluYWwgc2hhcGUgKGluZGl2aWR1YWwgPiBncm91cCA+IGdsb2JhbCkNCiAgICBpZihub2RlLnNoYXBlICE9PSB1bmRlZmluZWQpew0KICAgICAgZmluYWxfc2hhcGUgPSBub2RlLnNoYXBlOw0KICAgIH0gZWxzZSBpZihzaGFwZV9ncm91cCl7DQogICAgICBmaW5hbF9zaGFwZSA9IGdyb3Vwcy5ncm91cHNbbm9kZS5ncm91cF0uc2hhcGU7DQogICAgfSBlbHNlIGlmKHNoYXBlX29wdGlvbnMpew0KICAgICAgZmluYWxfc2hhcGUgPSBvcHRpb25zLm5vZGVzLnNoYXBlOw0KICAgIH0NCiAgICANCiAgICAvLyBpbmZvcm1hdGlvbiBzYXZlIGluIGJvZHkgbm9kZXMNCiAgICBpZih0eXBlID09PSAibm9kZSIpew0KICAgICAgbm9kZS5ib2R5SGlkZGVuQ29sb3IgPSBjbG9uZShuZXR3b3JrLmJvZHkubm9kZXNbbm9kZS5pZF0ub3B0aW9ucy5jb2xvcik7DQogICAgfSBlbHNlIHsNCiAgICAgIG5vZGUuc2V0T3B0aW9ucyh7Ym9keUhpZGRlbkNvbG9yIDogY2xvbmUobmV0d29yay5ib2R5Lm5vZGVzW25vZGUuaWRdLm9wdGlvbnMuY29sb3IpfSk7DQogICAgfQ0KICANCiAgICAvLyBhbmQgY2FsbCBnb29kIGZ1bmN0aW9uDQogICAgaWYoZmluYWxfc2hhcGUgPT09ICJpY29uIil7DQogICAgICAvLyBmaW5kIGNvbG9yIGZvciBpY29uDQogICAgICB2YXIgaWNvbl9jb2xvciA9ICIjMkI3Q0U5IjsNCiAgICAgIHZhciBmaW5kX2NvbG9yID0gZmFsc2U7DQogICAgICAvLyBpbiBub2RlcyA/DQogICAgICBpZihub2RlLmljb24gIT09IHVuZGVmaW5lZCl7DQogICAgICAgIGlmKG5vZGUuaWNvbi5jb2xvciAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICBpY29uX2NvbG9yID0gbm9kZS5pY29uLmNvbG9yOw0KICAgICAgICAgIGZpbmRfY29sb3IgPSB0cnVlOw0KICAgICAgICB9DQogICAgICB9IA0KICAgICAgLy8gb3IgaW4gZ3JvdXAgPw0KICAgICAgaWYoZmluZF9jb2xvciA9PT0gZmFsc2UgJiYgaXNfZ3JvdXAgJiYgZ3JvdXBzLmdyb3Vwc1tub2RlLmdyb3VwXS5pY29uICE9PSB1bmRlZmluZWQpew0KICAgICAgICBpZihncm91cHMuZ3JvdXBzW25vZGUuZ3JvdXBdLmljb24uY29sb3IgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgaWNvbl9jb2xvciA9IGdyb3Vwcy5ncm91cHNbbm9kZS5ncm91cF0uaWNvbi5jb2xvcjsNCiAgICAgICAgICBmaW5kX2NvbG9yID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgLy8gaW4gZ2xvYmFsIG5vZGUgPw0KICAgICAgaWYoZmluZF9jb2xvciA9PT0gZmFsc2UgJiYgb3B0aW9ucy5ub2Rlcy5pY29uICE9PSB1bmRlZmluZWQpew0KICAgICAgICBpZihvcHRpb25zLm5vZGVzLmljb24uY29sb3IgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgaWNvbl9jb2xvciA9IG9wdGlvbnMubm9kZXMuaWNvbi5jb2xvcjsNCiAgICAgICAgfQ0KICAgICAgfSANCiAgICAgIGljb25zTm9kZUFzSGFyZFRvUmVhZChub2RlLCBoaWRlQ29sb3IxLCBoaWRlQ29sb3IyLCBpY29uX2NvbG9yLCB0eXBlKTsNCiAgICB9IGVsc2UgaWYoZmluYWxfc2hhcGUgPT09ICJpbWFnZSIpew0KICAgICAgaW1hZ2VOb2RlQXNIYXJkVG9SZWFkKG5vZGUsICJpbWFnZSIsIGhpZGVDb2xvcjEsIGhpZGVDb2xvcjIsIHR5cGUpOw0KICAgIH0gZWxzZSBpZihmaW5hbF9zaGFwZSA9PT0gImNpcmN1bGFySW1hZ2UiKXsNCiAgICAgIGltYWdlTm9kZUFzSGFyZFRvUmVhZChub2RlLCAiY2lyY3VsYXJJbWFnZSIsIGhpZGVDb2xvcjEsIGhpZGVDb2xvcjIsIHR5cGUpOw0KICAgIH0gZWxzZSB7DQogICAgICBzaW1wbGVOb2RlQXNIYXJkVG9SZWFkKG5vZGUsIGhpZGVDb2xvcjEsIGhpZGVDb2xvcjIsIHR5cGUpOw0KICAgIH0NCiAgICANCiAgICAvLyBmaW5hbGx5IHNldCBpc0hhcmRUb1JlYWQNCiAgICBpZih0eXBlID09PSAibm9kZSIpew0KICAgICAgbm9kZS5pc0hhcmRUb1JlYWQgPSB0cnVlOw0KICAgIH0gZWxzZSB7DQogICAgICBub2RlLnNldE9wdGlvbnMoe2lzSGFyZFRvUmVhZCA6IHRydWV9KTsNCiAgICB9DQogIC8vIHNwZWNpYWwgY2FzZSBvZiBqdXN0IHRvIGxhYmVsICANCiAgfSBlbHNlIGlmKG5vZGUuaXNIYXJkVG9SZWFkID09PSB0cnVlICYmIG5vZGUubGFiZWwgIT09IHVuZGVmaW5lZCl7DQogICAgaWYodHlwZSA9PT0gIm5vZGUiKXsNCiAgICAgIG5vZGUuaGlkZGVuTGFiZWwgPSBub2RlLmxhYmVsOw0KICAgICAgbm9kZS5sYWJlbCA9IHVuZGVmaW5lZDsNCiAgICB9IGVsc2Ugew0KICAgICAgbm9kZS5zZXRPcHRpb25zKHtoaWRkZW5MYWJlbCA6IG5vZGUub3B0aW9ucy5sYWJlbCwgbGFiZWwgOiB1bmRlZmluZWR9KQ0KICAgIH0NCiAgfQ0KfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIFJldnJpdGUgSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMygpIGZvciBwYXNzaW5nIGN1c3RvbQ0KLy8gcHJvcGVydGllcyBkaXJlY3RseSBpbiBkYXRhLmZyYW1lIChjb2xvci5iYWNrZ3JvdW5kKSBmb3IgZXhhbXBsZQ0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiB2aXNOZXR3b3JrZGF0YWZyYW1lVG9EMyhkZiwgdHlwZSkgew0KDQogIC8vIHZhcmlhYmxlcyB3ZSBoYXZlIHNwZWNpYWxseSB0byBjb250cm9sDQogIHZhciBub2Rlc2N0cmwgPSBbImNvbG9yIiwgImZpeGVkIiwgImZvbnQiLCAiaWNvbiIsICJzaGFkb3ciLCAic2NhbGluZyIsICJzaGFwZVByb3BlcnRpZXMiLCAiY2hvc2VuIiwgImhlaWdodENvbnN0cmFpbnQiLCAiaW1hZ2UiLCAibWFyZ2luIiwgIndpZHRoQ29uc3RyYWludCJdOw0KICB2YXIgZWRnZXNjdHJsID0gWyJjb2xvciIsICJmb250IiwgImFycm93cyIsICJzaGFkb3ciLCAic21vb3RoIiwgInNjYWxpbmciLCAiY2hvc2VuIiwgIndpZHRoQ29uc3RyYWludCJdOw0KICANCiAgdmFyIG5hbWVzID0gW107DQogIHZhciBjb2xuYW1lcyA9IFtdOw0KICB2YXIgbGVuZ3RoOw0KICB2YXIgdG9jdHJsOw0KICB2YXIgY3RybG5hbWU7DQogIA0KICBmb3IgKHZhciBuYW1lIGluIGRmKSB7DQogICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQ0KICAgICAgY29sbmFtZXMucHVzaChuYW1lKTsNCiAgICAgIGN0cmxuYW1lID0gbmFtZS5zcGxpdCgiLiIpOw0KICAgICAgaWYoY3RybG5hbWUubGVuZ3RoID09PSAxKXsNCiAgICAgICAgbmFtZXMucHVzaCggbmV3IEFycmF5KG5hbWUpKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGlmKHR5cGUgPT09ICJub2RlcyIpew0KICAgICAgICAgdG9jdHJsID0gaW5kZXhPZi5jYWxsKG5vZGVzY3RybCwgY3RybG5hbWVbMF0sIHRydWUpOw0KICAgICAgICB9IGVsc2UgaWYodHlwZSA9PT0gImVkZ2VzIil7DQogICAgICAgICB0b2N0cmwgPSBpbmRleE9mLmNhbGwoZWRnZXNjdHJsLCBjdHJsbmFtZVswXSwgdHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYodG9jdHJsID4gLTEpew0KICAgICAgICAgIG5hbWVzLnB1c2goY3RybG5hbWUpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIG5hbWVzLnB1c2gobmV3IEFycmF5KG5hbWUpKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKHR5cGVvZihkZltuYW1lXSkgIT09ICJvYmplY3QiIHx8IHR5cGVvZihkZltuYW1lXS5sZW5ndGgpID09PSAidW5kZWZpbmVkIikgew0KICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyIpOw0KICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsNCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIik7DQogICAgICB9DQogICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7DQogIH0NCg0KICB2YXIgcmVzdWx0cyA9IFtdOw0KICB2YXIgaXRlbTsNCiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7DQogICAgICBpdGVtID0ge307DQogICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBuYW1lcy5sZW5ndGg7IGNvbCsrKSB7DQogICAgICAgIGlmKGRmW2NvbG5hbWVzW2NvbF1dW3Jvd10gIT09IG51bGwpew0KICAgICAgICAgIGlmKG5hbWVzW2NvbF0ubGVuZ3RoID09PSAxKXsNCiAgICAgICAgICAgIGlmKG5hbWVzW2NvbF1bMF0gPT09ICJkYXNoZXMiKXsNCiAgICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGV2YWwoZGZbY29sbmFtZXNbY29sXV1bcm93XSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1dID0gZGZbY29sbmFtZXNbY29sXV1bcm93XTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGVsc2UgaWYobmFtZXNbY29sXS5sZW5ndGggPT09IDIpew0KICAgICAgICAgICAgaWYoaXRlbVtuYW1lc1tjb2xdWzBdXSA9PT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdWzBdXSA9IHt9Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYobmFtZXNbY29sXVswXSA9PT0gImljb24iICYmIG5hbWVzW2NvbF1bMV0gPT09ICJjb2RlIil7DQogICAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXVswXV1bbmFtZXNbY29sXVsxXV0gPSBKU09OLnBhcnNlKCAnIicrJ1xcdScgKyBkZltjb2xuYW1lc1tjb2xdXVtyb3ddICsgJyInKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZihuYW1lc1tjb2xdWzBdID09PSAiaWNvbiIgJiYgbmFtZXNbY29sXVsxXSA9PT0gImNvbG9yIil7DQogICAgICAgICAgICAgIGl0ZW0uY29sb3IgPSBkZltjb2xuYW1lc1tjb2xdXVtyb3ddOw0KICAgICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dID0gZGZbY29sbmFtZXNbY29sXV1bcm93XTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdWzBdXVtuYW1lc1tjb2xdWzFdXSA9IGRmW2NvbG5hbWVzW2NvbF1dW3Jvd107DQogICAgICAgICAgICB9DQogICAgICAgICAgfSBlbHNlIGlmKG5hbWVzW2NvbF0ubGVuZ3RoID09PSAzKXsNCiAgICAgICAgICAgIGlmKGl0ZW1bbmFtZXNbY29sXVswXV0gPT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXVswXV0gPSB7fTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGl0ZW1bbmFtZXNbY29sXVswXV1bbmFtZXNbY29sXVsxXV0gPT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXVswXV1bbmFtZXNbY29sXVsxXV0gPSB7fTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXVswXV1bbmFtZXNbY29sXVsxXV1bbmFtZXNbY29sXVsyXV0gPSBkZltjb2xuYW1lc1tjb2xdXVtyb3ddOw0KICAgICAgICAgIH0gZWxzZSBpZihuYW1lc1tjb2xdLmxlbmd0aCA9PT0gNCl7DQogICAgICAgICAgICBpZihpdGVtW25hbWVzW2NvbF1bMF1dID09PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1bMF1dID0ge307DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dID09PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dID0ge307DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dW25hbWVzW2NvbF1bMl1dID09PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dW25hbWVzW2NvbF1bMl1dID0ge307DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dW25hbWVzW2NvbF1bMl1dW25hbWVzW2NvbF1bM11dID0gZGZbY29sbmFtZXNbY29sXV1bcm93XTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsNCiAgICB9DQogIHJldHVybiByZXN1bHRzOw0KfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIFNvbWUgdXRpbHMgZnVuY3Rpb25zDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQoNCi8vdW5pcXVlIGVsZW1lbnQgaW4gYXJyYXkNCmZ1bmN0aW9uIHVuaXF1ZUFycmF5KGFyciwgZXhjbHVkZV9jbHVzdGVyLCBuZXR3b3JrKSB7DQogIHZhciBhID0gW107DQogIGZvciAodmFyIGk9MCwgbD1hcnIubGVuZ3RoOyBpPGw7IGkrKyl7DQogICAgaWYgKGEuaW5kZXhPZihhcnJbaV0pID09PSAtMSAmJiBhcnJbaV0gIT09ICcnKXsNCiAgICAgIGlmKGV4Y2x1ZGVfY2x1c3RlciA9PT0gZmFsc2Upew0KICAgICAgICBhLnB1c2goYXJyW2ldKTsNCiAgICAgIH0gZWxzZSBpZihuZXR3b3JrLmlzQ2x1c3RlcihhcnJbaV0pID09PSBmYWxzZSl7DQogICAgICAgIGEucHVzaChhcnJbaV0pOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBhOw0KfQ0KLy8gY2xvbmUgYW4gb2JqZWN0DQpmdW5jdGlvbiBjbG9uZShvYmopIHsNCiAgICBpZihvYmogPT09IG51bGwgfHwgdHlwZW9mKG9iaikgIT0gJ29iamVjdCcpDQogICAgICAgIHJldHVybiBvYmo7ICAgIA0KICAgIHZhciB0ZW1wID0gbmV3IG9iai5jb25zdHJ1Y3RvcigpOyANCiAgICBmb3IodmFyIGtleSBpbiBvYmopDQogICAgICAgIHRlbXBba2V5XSA9IGNsb25lKG9ialtrZXldKTsgICAgDQogICAgcmV0dXJuIHRlbXA7DQp9DQovLyB1cGRhdGUgYSBsaXN0DQpmdW5jdGlvbiB1cGRhdGUoc291cmNlLCB0YXJnZXQpIHsNCglPYmplY3Qua2V5cyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24gKGspIHsNCgkJaWYgKHR5cGVvZiB0YXJnZXRba10gPT09ICdvYmplY3QnICYmIGsgIT09ICJjb250YWluZXIiKSB7DQoJCQlzb3VyY2Vba10gPSBzb3VyY2Vba10gfHwge307DQoJCQl1cGRhdGUoc291cmNlW2tdLCB0YXJnZXRba10pOw0KCQl9IGVsc2Ugew0KCQkJc291cmNlW2tdID0gdGFyZ2V0W2tdOw0KCQl9DQoJfSk7DQp9DQovLyBmb3IgZmluZCBlbGVtZW50DQpmdW5jdGlvbiBpbmRleE9mKG5lZWRsZSwgc3RyKSB7DQogICAgICAgIGluZGV4T2YgPSBmdW5jdGlvbihuZWVkbGUsIHN0cikgew0KICAgICAgICAgICAgdmFyIGkgPSAtMSwgaW5kZXggPSAtMTsNCiAgICAgICAgICAgIGlmKHN0cil7DQogICAgICAgICAgICAgICAgICBuZWVkbGUgPSAnJytuZWVkbGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXNbaV07DQogICAgICAgICAgICAgICAgaWYoc3RyKXsNCiAgICAgICAgICAgICAgICAgIHZhbCA9ICcnK3ZhbDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYodmFsID09PSBuZWVkbGUpIHsNCiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gaW5kZXg7DQogICAgICAgIH07DQogICAgcmV0dXJuIGluZGV4T2YuY2FsbCh0aGlzLCBuZWVkbGUsIHN0cik7DQp9Ow0KLy8gcmVzZXQgYSBodG1sIGxpc3QNCmZ1bmN0aW9uIHJlc2V0TGlzdChsaXN0X25hbWUsIGlkLCBzaGlueV9pbnB1dF9uYW1lKSB7DQogIHZhciBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobGlzdF9uYW1lICsgaWQpOw0KICBsaXN0LnZhbHVlID0gIiI7DQogIGlmICh3aW5kb3cuU2hpbnkpew0KICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoaWQgKyAnXycgKyBzaGlueV9pbnB1dF9uYW1lLCAiIik7DQogIH0NCn0NCi8vIGlkIG5vZGUgbGlzdCBzZWxlY3Rpb24gaW5pdA0KZnVuY3Rpb24gc2V0Tm9kZUlkTGlzdChzZWxlY3RMaXN0LCBwYXJhbXMsIG5vZGVzKXsNCiAgaWYocGFyYW1zLnN0eWxlICE9PSB1bmRlZmluZWQpew0KICAgIHNlbGVjdExpc3Quc2V0QXR0cmlidXRlKCdzdHlsZScsIHBhcmFtcy5zdHlsZSk7DQogIH0NCiAgc2VsZWN0TGlzdC5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7DQogICAgICANCiAgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7DQogIG9wdGlvbi52YWx1ZSA9ICIiOw0KICBvcHRpb24udGV4dCA9ICJTZWxlY3QgYnkgaWQiOw0KICBzZWxlY3RMaXN0LmFwcGVuZENoaWxkKG9wdGlvbik7DQogICAgICANCiAgLy8gaGF2ZSB0byBzZXQgZm9yIGFsbCBub2RlcyA/DQogIGlmKHBhcmFtcy52YWx1ZXMgPT09IHVuZGVmaW5lZCl7DQogICAgdmFyIGluZm9fbm9kZV9saXN0ID0gbm9kZXMuZ2V0KHsNCiAgICAgIGZpZWxkczogWydpZCcsICdsYWJlbCddLA0KICAgICAgcmV0dXJuVHlwZSA6J0FycmF5Jw0KICAgIH0pOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5mb19ub2RlX2xpc3QubGVuZ3RoOyBpKyspIHsNCiAgICAgIG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOw0KICAgICAgb3B0aW9uLnZhbHVlID0gaW5mb19ub2RlX2xpc3RbaV0uaWQ7DQogICAgICBpZihpbmZvX25vZGVfbGlzdFtpXS5sYWJlbCAmJiBwYXJhbXMudXNlTGFiZWxzKXsNCiAgICAgICAgb3B0aW9uLnRleHQgPSBpbmZvX25vZGVfbGlzdFtpXS5sYWJlbDsNCiAgICAgIH1lbHNlew0KICAgICAgICBvcHRpb24udGV4dCA9IGluZm9fbm9kZV9saXN0W2ldLmlkOw0KICAgICAgfQ0KICAgICAgc2VsZWN0TGlzdC5hcHBlbmRDaGlsZChvcHRpb24pOw0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICB2YXIgdG1wX25vZGU7DQogICAgZm9yKHZhciB0bXBfaWQgPSAwIDsgdG1wX2lkIDwgcGFyYW1zLnZhbHVlcy5sZW5ndGg7IHRtcF9pZCsrKXsNCiAgICAgIHRtcF9ub2RlID0gbm9kZXMuZ2V0KHsNCiAgICAgICAgZmllbGRzOiBbJ2lkJywgJ2xhYmVsJ10sDQogICAgICAgIGZpbHRlcjogZnVuY3Rpb24gKGl0ZW0pIHsNCiAgICAgICAgICByZXR1cm4gKGl0ZW0uaWQgPT09IHBhcmFtcy52YWx1ZXNbdG1wX2lkXSkgOw0KICAgICAgICB9LA0KICAgICAgICByZXR1cm5UeXBlIDonQXJyYXknDQogICAgICB9KTsNCiAgICAgIGlmKHRtcF9ub2RlICE9PSB1bmRlZmluZWQpew0KICAgICAgICBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTsNCiAgICAgICAgb3B0aW9uLnZhbHVlID0gdG1wX25vZGVbMF0uaWQ7DQogICAgICAgIGlmKHRtcF9ub2RlWzBdLmxhYmVsICYmIHBhcmFtcy51c2VMYWJlbHMpew0KICAgICAgICAgIG9wdGlvbi50ZXh0ID0gdG1wX25vZGVbMF0ubGFiZWw7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgIG9wdGlvbi50ZXh0ID0gdG1wX25vZGVbMF0uaWQ7DQogICAgICAgIH0NCiAgICAgICAgc2VsZWN0TGlzdC5hcHBlbmRDaGlsZChvcHRpb24pOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIENvbGxhcHNlZCBmdW5jdGlvbg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIA0KDQpmdW5jdGlvbiBuZXR3b3JrT3BlbkNsdXN0ZXIocGFyYW1zKXsNCiAgaWYgKHBhcmFtcy5ub2Rlcy5sZW5ndGggPT09IDEpIHsNCiAgICBpZiAodGhpcy5pc0NsdXN0ZXIocGFyYW1zLm5vZGVzWzBdKSA9PT0gdHJ1ZSkgew0KICAgICAgdmFyIGVsaWQgPSB0aGlzLmJvZHkuY29udGFpbmVyLmlkLnN1YnN0cmluZyg1KTsNCiAgICAgIHZhciBmaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGlkKS5jb2xsYXBzZUZpdDsNCiAgICAgIHZhciByZXNldEhpZ2hsaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsaWQpLmNvbGxhcHNlUmVzZXRIaWdobGlnaHQ7DQogICAgICB0aGlzLm9wZW5DbHVzdGVyKHBhcmFtcy5ub2Rlc1swXSk7DQogICAgICANCiAgICAgIGlmKHJlc2V0SGlnaGxpZ2h0KXsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5vZGVTZWxlY3QiK2VsaWQpLnZhbHVlID0gIiI7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub2RlU2VsZWN0IitlbGlkKS5vbmNoYW5nZSgpOw0KICAgICAgfQ0KICAgICAgaWYoZml0KXsNCiAgICAgICAgdGhpcy5maXQoKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gY29sbGFwc2VkTmV0d29yayhub2RlcywgZml0LCByZXNldEhpZ2hsaWdodCwgY2x1c3RlclBhcmFtcywgdHJlZVBhcmFtcywgbmV0d29yaywgZWxpZCkgew0KICANCiAgdmFyIHNldF9wb3NpdGlvbiA9IHRydWU7DQogIHZhciBzZWxlY3RlZE5vZGU7DQogIHZhciBqOw0KICANCiAgaWYobm9kZXNbMF0gIT09IHVuZGVmaW5lZCl7DQogICAgDQogICAgZm9yICh2YXIgaW5vZGVzID0gMDsgaW5vZGVzIDwgbm9kZXMubGVuZ3RoOyBpbm9kZXMrKykgew0KICAgICAgDQogICAgICBzZWxlY3RlZE5vZGUgPSBub2Rlc1tpbm9kZXNdOw0KICAgICAgaWYoc2VsZWN0ZWROb2RlICE9PSB1bmRlZmluZWQpew0KICAgICAgICBpZihuZXR3b3JrLmlzQ2x1c3RlcihzZWxlY3RlZE5vZGUpKXsNCiAgICAgICAgICAvL25ldHdvcmsub3BlbkNsdXN0ZXIoc2VsZWN0ZWROb2RlKQ0KICAgICAgICAgIC8qaW5zdGFuY2UubmV0d29yay5vcGVuQ2x1c3RlcihzZWxlY3RlZE5vZGUsIA0KICAgICAgICAgIHtyZWxlYXNlRnVuY3Rpb24gOiBmdW5jdGlvbihjbHVzdGVyUG9zaXRpb24sIGNvbnRhaW5lZE5vZGVzUG9zaXRpb25zKSB7DQogICAgICAgICAgICByZXR1cm4gdG1wX3Bvc2l0aW9uOw0KICAgICAgICAgIH19KSovDQogICAgICAgICAgLy9uZXR3b3JrT3BlbkNsdXN0ZXIoc2VsZWN0ZWROb2RlKQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHZhciBmaXJzdExldmVsTm9kZXMgPSBbXTsNCiAgICAgICAgICB2YXIgb3RoZXJMZXZlbE5vZGVzID0gW107DQogICAgICAgICAgdmFyIGNvbm5lY3RlZFRvTm9kZXMgPSBbXTsNCiAgICAgIA0KICAgICAgICAgIGl0ZW0gPSBuZXR3b3JrLmJvZHkuZGF0YS5ub2Rlcy5nZXQoew0KICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiAoaXRlbSkgew0KICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pZCA9PSBzZWxlY3RlZE5vZGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgfSk7DQogICAgICAgICAgICANCiAgICAgICAgICBjb25uZWN0ZWRUb05vZGVzID0gbmV0d29yay5ib2R5LmRhdGEuZWRnZXMuZ2V0KHsNCiAgICAgICAgICBmaWVsZHM6IFsnaWQnLCd0byddLA0KICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiAoaXRlbSkgew0KICAgICAgICAgICAgICByZXR1cm4gaXRlbS5mcm9tID09IHNlbGVjdGVkTm9kZTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICByZXR1cm5UeXBlIDonQXJyYXknDQogICAgICAgICAgfSk7DQogICAgICAgICAgICAgIA0KICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb25uZWN0ZWRUb05vZGVzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICBmaXJzdExldmVsTm9kZXMgPSBmaXJzdExldmVsTm9kZXMuY29uY2F0KGNvbm5lY3RlZFRvTm9kZXNbal0udG8pOw0KICAgICAgICAgIH0NCiAgICANCiAgICAgICAgICB2YXIgY3VycmVudENvbm5lY3RlZFRvTm9kZXMgPSBmaXJzdExldmVsTm9kZXM7DQogICAgICAgICAgd2hpbGUoY3VycmVudENvbm5lY3RlZFRvTm9kZXMubGVuZ3RoICE9PSAwKXsNCiAgICAgICAgICAgIGNvbm5lY3RlZFRvTm9kZXMgPSBuZXR3b3JrLmJvZHkuZGF0YS5lZGdlcy5nZXQoew0KICAgICAgICAgICAgICBmaWVsZHM6IFsnaWQnLCAndG8nXSwNCiAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChpdGVtKSB7DQogICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhPZi5jYWxsKGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzLCBpdGVtLmZyb20sIHRydWUpID4gLTE7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZXR1cm5UeXBlIDonQXJyYXknDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzID0gW107DQogICAgICAgICAgICB2YXIgY3VycmVudGxlbmd0aCA9IG90aGVyTGV2ZWxOb2Rlcy5sZW5ndGg7DQogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29ubmVjdGVkVG9Ob2Rlcy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICBvdGhlckxldmVsTm9kZXMgPSB1bmlxdWVBcnJheShvdGhlckxldmVsTm9kZXMuY29uY2F0KGNvbm5lY3RlZFRvTm9kZXNbal0udG8pLCBmYWxzZSwgbmV0d29yayk7DQogICAgICAgICAgICAgIGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzID0gdW5pcXVlQXJyYXkoY3VycmVudENvbm5lY3RlZFRvTm9kZXMuY29uY2F0KGNvbm5lY3RlZFRvTm9kZXNbal0udG8pLCBmYWxzZSwgbmV0d29yayk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAob3RoZXJMZXZlbE5vZGVzLmxlbmd0aCA9PT0gY3VycmVudGxlbmd0aCkgeyBicmVhazsgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICAgICAgDQogICAgICAgICAgdmFyIGZpbmFsRmlyc3RMZXZlbE5vZGVzID0gW107DQogICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpcnN0TGV2ZWxOb2Rlcy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgdmFyIGZpbmRub2RlID0gbmV0d29yay5jbHVzdGVyaW5nLmZpbmROb2RlKGZpcnN0TGV2ZWxOb2Rlc1tqXSkNCiAgICAgICAgICAgIGlmKGZpbmRub2RlLmxlbmd0aCA9PT0gMSl7DQogICAgICAgICAgICAgIGZpbmFsRmlyc3RMZXZlbE5vZGVzID0gZmluYWxGaXJzdExldmVsTm9kZXMuY29uY2F0KGZpcnN0TGV2ZWxOb2Rlc1tqXSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBmaW5hbEZpcnN0TGV2ZWxOb2RlcyA9IGZpbmFsRmlyc3RMZXZlbE5vZGVzLmNvbmNhdChmaW5kbm9kZVswXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIHZhciBmaW5hbENsdXN0ZXJOb2RlcyA9IFtdOw0KICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdGhlckxldmVsTm9kZXMubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgIHZhciBmaW5kbm9kZSA9IG5ldHdvcmsuY2x1c3RlcmluZy5maW5kTm9kZShvdGhlckxldmVsTm9kZXNbal0pDQogICAgICAgICAgICBpZihmaW5kbm9kZS5sZW5ndGggPT09IDEpew0KICAgICAgICAgICAgICBmaW5hbENsdXN0ZXJOb2RlcyA9IGZpbmFsQ2x1c3Rlck5vZGVzLmNvbmNhdChvdGhlckxldmVsTm9kZXNbal0pOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgZmluYWxDbHVzdGVyTm9kZXMgPSBmaW5hbENsdXN0ZXJOb2Rlcy5jb25jYXQoZmluZG5vZGVbMF0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICANCiAgICAgICAgICBpZihzZXRfcG9zaXRpb24peyANCiAgICAgICAgICAgIG5ldHdvcmsuc3RvcmVQb3NpdGlvbnMoKTsNCiAgICAgICAgICB9DQogICAgDQogICAgICAgICAgdmFyIGNsdXN0ZXJPcHRpb25zID0gew0KICAgICAgICAgICAgam9pbkNvbmRpdGlvbjogZnVuY3Rpb24gKG5vZGVzT3B0aW9ucykgew0KICAgICAgICAgICAgICByZXR1cm4gbm9kZXNPcHRpb25zLmlkID09PSBzZWxlY3RlZE5vZGUgfHwgaW5kZXhPZi5jYWxsKGZpbmFsRmlyc3RMZXZlbE5vZGVzLCBub2Rlc09wdGlvbnMuaWQsIHRydWUpID4gLTEgfHwgDQogICAgICAgICAgICAgICAgICBpbmRleE9mLmNhbGwoZmluYWxDbHVzdGVyTm9kZXMsIG5vZGVzT3B0aW9ucy5pZCwgdHJ1ZSkgPiAtMTsgDQogICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgIHByb2Nlc3NQcm9wZXJ0aWVzOiBmdW5jdGlvbihjbHVzdGVyT3B0aW9ucywgY2hpbGROb2Rlcykgew0KICAgICAgICAgICAgICAgIHZhciBjbGlja19ub2RlID0gbmV0d29yay5ib2R5LmRhdGEubm9kZXMuZ2V0KHsNCiAgICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24gKGl0ZW0pIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQgPT0gc2VsZWN0ZWROb2RlOw0KICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgOidBcnJheScNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgaXNfaGFyZF90b19yZWFkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgaWYoY2xpY2tfbm9kZVswXS5pc0hhcmRUb1JlYWQgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICAgICAgICBpc19oYXJkX3RvX3JlYWQgPSBjbGlja19ub2RlWzBdLmlzSGFyZFRvUmVhZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBjbGlja19ub2RlWzBdKSB7DQogICAgICAgICAgICAgICAgICBpZihpICE9PSAiaWQiICYmIGkgIT09ICJpc0hhcmRUb1JlYWQiKXsNCiAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gImxhYmVsIiAmJiBpc19oYXJkX3RvX3JlYWQpew0KICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zW2ldPSAgY2xpY2tfbm9kZVswXVsiaGlkZGVuTGFiZWwiXTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGkgPT09ICJjb2xvciIgJiYgaXNfaGFyZF90b19yZWFkKSB7DQogICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnNbaV09ICBjbGlja19ub2RlWzBdWyJoaWRkZW5Db2xvciJdOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9uc1tpXT0gIGNsaWNrX25vZGVbMF1baV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvLyBnZXN0aW9uIGRlcyB0cmVlDQogICAgICAgICAgICAgICAgaWYodHJlZVBhcmFtcyAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgICAgICAgIGlmKHRyZWVQYXJhbXMudXBkYXRlU2hhcGUpew0KICAgICAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy5sYWJlbCA9IGNsdXN0ZXJPcHRpb25zLmxhYmVsQ2x1c3QNCiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMuY29sb3IgPSBjbHVzdGVyT3B0aW9ucy5jb2xvckNsdXN0DQogICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLnNoYXBlID0gdHJlZVBhcmFtcy5zaGFwZVkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZihjbHVzdGVyT3B0aW9ucy5sYWJlbCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLmxhYmVsID0gY2x1c3Rlck9wdGlvbnMubGFiZWwgKyAnIChjbHVzdGVyKScNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMubGFiZWwgPSAgJyhjbHVzdGVyKScNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZihjbHVzdGVyT3B0aW9ucy5ib3JkZXJXaWR0aCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLmJvcmRlcldpZHRoID0gY2x1c3Rlck9wdGlvbnMuYm9yZGVyV2lkdGggKiAzOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy5ib3JkZXJXaWR0aCA9ICAzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKHNldF9wb3NpdGlvbil7DQogICAgICAgICAgICAgICAgICBpZihjbGlja19ub2RlWzBdLnggIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLnggPSBjbGlja19ub2RlWzBdLng7DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBpZihjbGlja19ub2RlWzBdLnkgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLnkgPSBjbGlja19ub2RlWzBdLnk7DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKGNsdXN0ZXJQYXJhbXMgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICAgICAgICBmb3IgKHZhciBqIGluIGNsdXN0ZXJQYXJhbXMpIHsNCiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnNbal09ICBjbHVzdGVyUGFyYW1zW2pdOw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgIHJldHVybiBjbHVzdGVyT3B0aW9uczsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBjbHVzdGVyTm9kZVByb3BlcnRpZXM6IHsNCiAgICAgICAgICAgICAgYWxsb3dTaW5nbGVOb2RlQ2x1c3RlcjogZmFsc2UsDQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIG5ldHdvcmsuY2x1c3RlcihjbHVzdGVyT3B0aW9ucyk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIA0KICAgIH0NCiAgICBpZihyZXNldEhpZ2hsaWdodCl7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZWxpZCkudmFsdWUgPSAiIjsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub2RlU2VsZWN0IitlbGlkKS5vbmNoYW5nZSgpOw0KICAgIH0NCiAgICBpZihmaXQpew0KICAgICAgbmV0d29yay5maXQoKTsNCiAgICB9DQogIH0NCn07DQoNCmZ1bmN0aW9uIHVuY29sbGFwc2VkTmV0d29yayhub2RlcywgZml0LCByZXNldEhpZ2hsaWdodCwgbmV0d29yaywgZWxpZCkgew0KICB2YXIgc2VsZWN0ZWROb2RlOw0KICB2YXIgajsNCiAgdmFyIGFycl9ub2RlcyA9IFtdOw0KICB2YXIgY2x1c3Rlcl9ub2RlOw0KICANCiAgdmFyIG5vZGVzX2luX2NsdXN0ZXJzID0gbmV0d29yay5ib2R5Lm1vZHVsZXMuY2x1c3RlcmluZy5jbHVzdGVyZWROb2RlczsNCiAgaWYoT2JqZWN0LmtleXMobm9kZXNfaW5fY2x1c3RlcnMpLmxlbmd0aCA+IDApew0KICAgIG5vZGVzX2luX2NsdXN0ZXJzID0gT2JqZWN0LmtleXMobm9kZXNfaW5fY2x1c3RlcnMpOw0KICB9IGVsc2Ugew0KICAgIG5vZGVzX2luX2NsdXN0ZXJzID0gW10NCiAgfQ0KICAgIA0KICBpZihub2RlcyAhPT0gdW5kZWZpbmVkICYmIG5vZGVzICE9PSBudWxsKXsNCiAgICBhcnJfbm9kZXMgPSBub2Rlcw0KICB9IGVsc2Ugew0KICAgIGFycl9ub2RlcyA9IG5vZGVzX2luX2NsdXN0ZXJzOw0KICB9DQoNCiAgZm9yICh2YXIgaW5vZGVzID0gMDsgaW5vZGVzIDwgYXJyX25vZGVzLmxlbmd0aDsgaW5vZGVzKyspIHsNCiAgICBzZWxlY3RlZE5vZGUgPSBhcnJfbm9kZXNbaW5vZGVzXTsNCiAgICBpZihzZWxlY3RlZE5vZGUgIT09IHVuZGVmaW5lZCl7DQogICAgICAgIGlmKG5ldHdvcmsuaXNDbHVzdGVyKHNlbGVjdGVkTm9kZSkpew0KICAgICAgICAgIG5ldHdvcmsub3BlbkNsdXN0ZXIoc2VsZWN0ZWROb2RlKQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGlmKGluZGV4T2YuY2FsbChub2Rlc19pbl9jbHVzdGVycywgc2VsZWN0ZWROb2RlLCB0cnVlKSA+IC0xKXsNCiAgICAgICAgICAgIC8vIG5vdCBhIGNsdXN0ZXIgaW50byBhIGNsdXN0ZXIuLi4NCiAgICAgICAgICAgIGlmKHNlbGVjdGVkTm9kZS5zZWFyY2goL15jbHVzdGVyL2kpID09PSAtMSl7DQogICAgICAgICAgICAgIGNsdXN0ZXJfbm9kZSA9IG5ldHdvcmsuY2x1c3RlcmluZy5maW5kTm9kZShzZWxlY3RlZE5vZGUpWzBdOw0KICAgICAgICAgICAgICBpZihuZXR3b3JrLmlzQ2x1c3RlcihjbHVzdGVyX25vZGUpKXsNCiAgICAgICAgICAgICAgICBuZXR3b3JrLm9wZW5DbHVzdGVyKGNsdXN0ZXJfbm9kZSkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSANCiAgICAgIH0NCiAgICB9DQogIGlmKHJlc2V0SGlnaGxpZ2h0KXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZWxpZCkudmFsdWUgPSAiIjsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZWxpZCkub25jaGFuZ2UoKTsNCiAgfQ0KICBpZihmaXQpew0KICAgIG5ldHdvcmsuZml0KCk7DQogIH0NCn07DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gQWxsIGF2YWlsYWJsZSBmdW5jdGlvbnMvbWV0aG9kcyB3aXRoIHZpc05ldHdvcmtQcm94eQ0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQppZiAoSFRNTFdpZGdldHMuc2hpbnlNb2RlKXsNCiAgDQogIC8vIGNvbGxhcHNlZCBtZXRob2QNCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55Q29sbGFwc2UnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIGNvbGxhcHNlZE5ldHdvcmsoZGF0YS5ub2RlcywgZGF0YS5maXQsIGRhdGEucmVzZXRIaWdobGlnaHQsIGRhdGEuY2x1c3Rlck9wdGlvbnMsIHVuZGVmaW5lZCwgZWwuY2hhcnQsIGRhdGEuaWQpDQogICAgICB9DQogIH0pOw0KICANCiAgLy8gdW5jb2xsYXBzZWQgbWV0aG9kDQogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueVVuY29sbGFwc2UnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHVuY29sbGFwc2VkTmV0d29yayhkYXRhLm5vZGVzLCBkYXRhLmZpdCwgZGF0YS5yZXNldEhpZ2hsaWdodCwgZWwuY2hhcnQsIGRhdGEuaWQpDQogICAgICB9DQogIH0pOw0KDQogIC8vIGV2ZW50IG1ldGhvZA0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlFdmVudHMnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7DQogICAgICAgIA0KICAgICAgICBpZihkYXRhLnR5cGUgPT09ICJvbmNlIil7DQogICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEuZXZlbnRzKSB7DQogICAgICAgICAgICBldmFsKCduZXR3b3JrLm9uY2UoIicgKyBrZXkgKyAnIiwnICsgZGF0YS5ldmVudHNba2V5XSArICcpJyk7DQogICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYoZGF0YS50eXBlID09PSAib24iKXsNCiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YS5ldmVudHMpIHsNCiAgICAgICAgICAgIGV2YWwoJ25ldHdvcmsub24oIicgKyBrZXkgKyAnIiwnICsgZGF0YS5ldmVudHNba2V5XSArICcpJyk7DQogICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYoZGF0YS50eXBlID09PSAib2ZmIil7DQogICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEuZXZlbnRzKSB7DQogICAgICAgICAgICBldmFsKCduZXR3b3JrLm9mZigiJyArIGtleSArICciLCcgKyBkYXRhLmV2ZW50c1trZXldICsgJyknKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgfSk7DQogIA0KICAvLyBtb3ZlTm9kZSBtZXRob2QNCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55TW92ZU5vZGUnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7DQogICAgICAgIG5ldHdvcmsubW92ZU5vZGUoZGF0YS5ub2RlSWQsIGRhdGEueCwgZGF0YS55KTsNCiAgICAgIH0NCiAgfSk7DQogIA0KICAvLyB1bnNlbGVjdEFsbCBtZXRob2QNCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55VW5zZWxlY3RBbGwnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7DQogICAgICAgIA0KICAgICAgICAvLyByZXNldCBzZWxlY3Rpb24NCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5vZGVTZWxlY3QiK2RhdGEuaWQpLnZhbHVlID0gIiI7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub2RlU2VsZWN0IitkYXRhLmlkKS5vbmNoYW5nZSgpOw0KICAgICAgICANCiAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGF0YS5pZCkuc2VsZWN0QWN0aXZlID09PSB0cnVlKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RlZEJ5IitkYXRhLmlkKS52YWx1ZSA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2RhdGEuaWQpLm9uY2hhbmdlKCk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIG5ldHdvcmsudW5zZWxlY3RBbGwoKTsNCiAgICAgIH0NCiAgfSk7DQogIA0KICAvLyB1cGRhdGVPcHRpb25zIGluIHRoZSBuZXR3b3JrDQogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueU9wdGlvbnMnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7DQogICAgICAgIHZhciBvcHRpb25zID0gZWwub3B0aW9uczsNCiAgICAgICAgLy8gY29uZmlndXJlDQogICAgICAgIGlmKGRhdGEub3B0aW9ucy5jb25maWd1cmUgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmNvbmZpZ3VyZS5jb250YWluZXIgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICB2YXIgZG9tX2NvbmYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkYXRhLm9wdGlvbnMuY29uZmlndXJlLmNvbnRhaW5lcik7DQogICAgICAgICAgICBpZihkb21fY29uZiAhPT0gbnVsbCl7DQogICAgICAgICAgICAgIGRhdGEub3B0aW9ucy5jb25maWd1cmUuY29udGFpbmVyID0gZG9tX2NvbmY7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBkYXRhLm9wdGlvbnMuY29uZmlndXJlLmNvbnRhaW5lciA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICANCiAgICAgICAgdXBkYXRlKG9wdGlvbnMsIGRhdGEub3B0aW9ucyk7DQogICAgICAgIG5ldHdvcmsuc2V0T3B0aW9ucyhvcHRpb25zKTsNCiAgICAgIH0NCiAgfSk7DQogIA0KICAvLyBzZXREYXRhIHRoZSBuZXR3b3JrDQogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueVNldERhdGEnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7DQogICAgICAgIHZhciBuZXdub2RlcyA9IG5ldyB2aXMuRGF0YVNldCgpOw0KICAgICAgICB2YXIgbmV3ZWRnZXMgPSBuZXcgdmlzLkRhdGFTZXQoKTsNCgkJDQogICAgICAgIG5ld25vZGVzLmFkZCh2aXNOZXR3b3JrZGF0YWZyYW1lVG9EMyhkYXRhLm5vZGVzLCAibm9kZXMiKSk7DQogICAgICAgIG5ld2VkZ2VzLmFkZCh2aXNOZXR3b3JrZGF0YWZyYW1lVG9EMyhkYXRhLmVkZ2VzLCAiZWRnZXMiKSk7DQogICAgICAgIHZhciBuZXdkYXRhID0gew0KICAgICAgICAgIG5vZGVzOiBuZXdub2RlcywNCiAgICAgICAgICBlZGdlczogbmV3ZWRnZXMNCiAgICAgICAgfTsNCiAgICAgICAgbmV0d29yay5zZXREYXRhKG5ld2RhdGEpOw0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIGZpdCB0byBhIHNwZWNpZmljIG5vZGUNCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55Rml0JywgZnVuY3Rpb24oZGF0YSl7DQogICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgaWYoZWwpew0KICAgICAgICB2YXIgbmV0d29yayA9IGVsLmNoYXJ0Ow0KICAgICAgICBuZXR3b3JrLmZpdChkYXRhLm9wdGlvbnMpOw0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIGZvY3VzIG9uIGEgbm9kZSBpbiB0aGUgbmV0d29yaw0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlGb2N1cycsIGZ1bmN0aW9uKGRhdGEpew0KICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsNCiAgICAgIGlmKGVsKXsNCiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsNCiAgICAgICAgbmV0d29yay5mb2N1cyhkYXRhLmZvY3VzSWQsIGRhdGEub3B0aW9ucyk7DQogICAgICB9DQogIH0pOw0KICANCiAgLy8gc3RhYmlsaXplIHRoZSBuZXR3b3JrDQogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueVN0YWJpbGl6ZScsIGZ1bmN0aW9uKGRhdGEpew0KICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsNCiAgICAgIGlmKGVsKXsNCiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsNCiAgICAgICAgbmV0d29yay5zdGFiaWxpemUoZGF0YS5vcHRpb25zKTsNCiAgICAgIH0NCiAgfSk7DQoNCiAgLy8gc3RhcnRTaW11bGF0aW9uIG9uIG5ldHdvcmsNCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55U3RhcnRTaW11bGF0aW9uJywgZnVuY3Rpb24oZGF0YSl7DQogICAgICAvLyBnZXQgY29udGFpbmVyIGlkDQogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOw0KICAgICAgaWYoZWwpew0KICAgICAgICB2YXIgbmV0d29yayA9IGVsLmNoYXJ0Ow0KICAgICAgICBuZXR3b3JrLnN0YXJ0U2ltdWxhdGlvbigpOw0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIHN0b3BTaW11bGF0aW9uIG9uIG5ldHdvcmsNCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55U3RvcFNpbXVsYXRpb24nLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7DQogICAgICAgIG5ldHdvcmsuc3RvcFNpbXVsYXRpb24oKTsNCiAgICAgIH0NCiAgfSk7DQogIA0KICAvLyBnZXQgcG9zaXRpb25zIG9mIHRoZSBuZXR3b3JrDQogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueUdldFBvc2l0aW9ucycsIGZ1bmN0aW9uKGRhdGEpew0KICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsNCiAgICAgIGlmKGVsKXsNCiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsNCiAgICAgICAgdmFyIHBvczsNCiAgICAgICAgDQogICAgICAgIGlmKGRhdGEubm9kZXMgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgcG9zID0gbmV0d29yay5nZXRQb3NpdGlvbnMoZGF0YS5ub2Rlcyk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgIHBvcyA9IG5ldHdvcmsuZ2V0UG9zaXRpb25zKCk7DQogICAgICAgIH0NCgkJLy8gcmV0dXJuIHBvc2l0aW9ucyBpbiBzaGlueQ0KICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGRhdGEuaW5wdXQsIHBvcyk7DQogICAgICB9DQogIH0pOw0KICANCiAgLy8gZ2V0IGVkZ2VzIGRhdGENCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55R2V0RWRnZXMnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBjdXJyZW50X2VkZ2VzID0gZWwuZWRnZXMuZ2V0RGF0YVNldCgpOw0KICAgICAgICAvLyByZXR1cm4gZGF0YSBpbiBzaGlueQ0KICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGRhdGEuaW5wdXQsIGN1cnJlbnRfZWRnZXMuX2RhdGEpOw0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIGdldCBub2RlcyBkYXRhDQogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueUdldE5vZGVzJywgZnVuY3Rpb24oZGF0YSl7DQogICAgICAvLyBnZXQgY29udGFpbmVyIGlkDQogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOw0KICAgICAgaWYoZWwpew0KICAgICAgICBpZihkYXRhLmFkZENvb3JkaW5hdGVzKXsNCiAgICAgICAgICBlbC5jaGFydC5zdG9yZVBvc2l0aW9ucygpOw0KICAgICAgICB9DQogICAgICAgIHZhciBjdXJyZW50X25vZGVzID0gZWwubm9kZXMuZ2V0RGF0YVNldCgpOw0KICAgICAgICAvLyByZXR1cm4gZGF0YSBpbiBzaGlueQ0KICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGRhdGEuaW5wdXQsIGN1cnJlbnRfbm9kZXMuX2RhdGEpOw0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIGdldCBzZWxlY3RlZCBlZGdlcw0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlHZXRTZWxlY3RlZEVkZ2VzJywgZnVuY3Rpb24oZGF0YSl7DQogICAgICAvLyBnZXQgY29udGFpbmVyIGlkDQogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOw0KICAgICAgaWYoZWwpew0KICAgICAgICB2YXIgbmV0d29yayA9IGVsLmNoYXJ0Ow0KICAgICAgICB2YXIgcG9zID0gbmV0d29yay5nZXRTZWxlY3RlZEVkZ2VzKCk7DQoJCSAgICAvLyByZXR1cm4gIGluIHNoaW55DQogICAgICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoZGF0YS5pbnB1dCwgcG9zKTsNCiAgICAgIH0NCiAgfSk7DQogIA0KICAvLyBnZXQgc2VsZWN0ZWQgbm9kZXMNCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55R2V0U2VsZWN0ZWROb2RlcycsIGZ1bmN0aW9uKGRhdGEpew0KICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsNCiAgICAgIGlmKGVsKXsNCiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsNCiAgICAgICAgdmFyIHBvcyA9IG5ldHdvcmsuZ2V0U2VsZWN0ZWROb2RlcygpOw0KCQkgICAgLy8gcmV0dXJuICBpbiBzaGlueQ0KICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGRhdGEuaW5wdXQsIHBvcyk7DQogICAgICB9DQogIH0pOw0KICANCiAgLy8gZ2V0Q29ubmVjdGVkRWRnZXMNCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55R2V0Q29ubmVjdGVkRWRnZXMnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7DQogICAgICAgIHZhciBwb3MgPSBuZXR3b3JrLmdldENvbm5lY3RlZEVkZ2VzKGRhdGEubm9kZUlkKTsNCiAgICAgICAgLy8gcmV0dXJuICBpbiBzaGlueQ0KICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGRhdGEuaW5wdXQsIHBvcyk7DQogICAgICB9DQogIH0pOw0KICANCiAgLy8gZ2V0Q29ubmVjdGVkTm9kZXMNCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55R2V0Q29ubmVjdGVkTm9kZXMnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7DQogICAgICAgIHZhciBwb3MgPSBuZXR3b3JrLmdldENvbm5lY3RlZE5vZGVzKGRhdGEubm9kZUlkKTsNCiAgICAgICAgLy8gcmV0dXJuICBpbiBzaGlueQ0KICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGRhdGEuaW5wdXQsIHBvcyk7DQogICAgICB9DQogIH0pOw0KICANCiAgLy8gZ2V0Qm91bmRpbmdCb3gNCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55R2V0Qm91bmRpbmdCb3gnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7DQogICAgICAgIHZhciBwb3MgPSBuZXR3b3JrLmdldEJvdW5kaW5nQm94KGRhdGEubm9kZUlkKTsNCiAgICAgICAgLy8gcmV0dXJuICBpbiBzaGlueQ0KICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGRhdGEuaW5wdXQsIHBvcyk7DQogICAgICB9DQogIH0pOw0KICANCiAgLy8gZ2V0IHNlbGVjdGlvbg0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlHZXRTZWxlY3Rpb24nLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7DQogICAgICAgIHZhciBwb3M7DQogICAgICAgIA0KICAgICAgICBwb3MgPSBuZXR3b3JrLmdldFNlbGVjdGlvbigpOw0KDQoJCSAgICAvLyByZXR1cm4gIGluIHNoaW55DQogICAgICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoZGF0YS5pbnB1dCwgcG9zKTsNCiAgICAgIH0NCiAgfSk7DQogIA0KICAvLyBnZXQgc2NhbGUNCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55R2V0U2NhbGUnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7DQogICAgICAgIHZhciBwb3M7DQogICAgICAgIA0KICAgICAgICBwb3MgPSBuZXR3b3JrLmdldFNjYWxlKCk7DQoNCgkJICAgIC8vIHJldHVybiAgaW4gc2hpbnkNCiAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZShkYXRhLmlucHV0LCBwb3MpOw0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIHN0b3JlIHBvc2l0aW9ucw0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlTdG9yZVBvc2l0aW9ucycsIGZ1bmN0aW9uKGRhdGEpew0KICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsNCiAgICAgIGlmKGVsKXsNCiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsNCiAgICAgICAgbmV0d29yay5zdG9yZVBvc2l0aW9ucygpOw0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIGdldCB2aWV3IHBvc2l0aW9uDQogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueUdldFZpZXdQb3NpdGlvbicsIGZ1bmN0aW9uKGRhdGEpew0KICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsNCiAgICAgIGlmKGVsKXsNCiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsNCiAgICAgICAgdmFyIHBvczsNCiAgICAgICAgDQogICAgICAgIHBvcyA9IG5ldHdvcmsuZ2V0Vmlld1Bvc2l0aW9uKCk7DQoNCgkJICAgIC8vIHJldHVybiAgaW4gc2hpbnkNCiAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZShkYXRhLmlucHV0LCBwb3MpOw0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIFJlZHJhdyB0aGUgbmV0d29yaw0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlSZWRyYXcnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICBpZihlbCl7DQogICAgICAgIGVsLmNoYXJ0LnJlZHJhdygpOw0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIHNlbGVjdCBub2Rlcw0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlTZWxlY3ROb2RlcycsIGZ1bmN0aW9uKGRhdGEpew0KICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsNCiAgICAgIGlmKGVsKXsNCiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsNCiAgICAgICAgaWYoZGF0YS5zZWxpZCAhPT0gbnVsbCl7DQogICAgICAgICAgbmV0d29yay5zZWxlY3ROb2RlcyhkYXRhLnNlbGlkLCBkYXRhLmhpZ2hsaWdodEVkZ2VzKTsNCiAgICAgICAgICBpZihkYXRhLmNsaWNrRXZlbnQpew0KICAgICAgICAgICAgZWwubXljbGljayh7bm9kZXMgOiBkYXRhLnNlbGlkfSk7DQogICAgICAgICAgfQ0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICBpZihkYXRhLmNsaWNrRXZlbnQpew0KICAgICAgICAgICAgZWwubXljbGljayh7bm9kZXMgOiBbXX0pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIHNlbGVjdCBlZGdlcw0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlTZWxlY3RFZGdlcycsIGZ1bmN0aW9uKGRhdGEpew0KICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsNCiAgICAgIGlmKGVsKXsNCiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsNCiAgICAgICAgaWYoZGF0YS5zZWxpZCAhPT0gbnVsbCl7DQogICAgICAgICAgbmV0d29yay5zZWxlY3RFZGdlcyhkYXRhLnNlbGlkKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIHNldCBzZWxlY3Rpb24NCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55U2V0U2VsZWN0aW9uJywgZnVuY3Rpb24oZGF0YSl7DQogICAgICAvLyBnZXQgY29udGFpbmVyIGlkDQogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOw0KICAgICAgaWYoZWwpew0KICAgICAgICB2YXIgbmV0d29yayA9IGVsLmNoYXJ0Ow0KICAgICAgICBpZihkYXRhLnNlbGVjdGlvbi5ub2RlcyAhPT0gbnVsbCB8fCBkYXRhLnNlbGVjdGlvbi5lZGdlcyAhPT0gbnVsbCl7DQogICAgICAgICAgbmV0d29yay5zZXRTZWxlY3Rpb24oZGF0YS5zZWxlY3Rpb24sIGRhdGEub3B0aW9ucyk7DQogICAgICAgIH0NCiAgICAgICAgaWYoZGF0YS5jbGlja0V2ZW50KXsNCiAgICAgICAgICBpZihkYXRhLnNlbGVjdGlvbi5ub2RlcyAhPT0gbnVsbCl7DQogICAgICAgICAgICBlbC5teWNsaWNrKHtub2RlcyA6IGRhdGEuc2VsZWN0aW9uLm5vZGVzfSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgZWwubXljbGljayh7bm9kZXMgOiBbXX0pOyANCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgfSk7DQogIA0KICBmdW5jdGlvbiB1cGRhdGVWaXNPcHRpb25zKGRhdGEpew0KICAgICAgICAvLyBnZXQgY29udGFpbmVyIGlkDQogICAgICAgIHZhciBncmFwaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7DQogICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEuaWQpOw0KICAgICAgICB2YXIgZG9fbG9vcF9ieSA9IGZhbHNlOw0KICAgICAgICB2YXIgb3B0aW9uMjsNCiAgICAgICAgdmFyIHNlbGVjdExpc3QyOw0KICAgICAgICB2YXIgc2VsZWN0TGlzdDsNCiAgICAgICAgdmFyIHJlc2V0ID0gZmFsc2U7DQogICAgICAgIA0KICAgICAgICBpZihncmFwaCl7DQogICAgICAgICAgLy8gcmVzZXQgbm9kZXMgYmVmb3JlID8NCiAgICAgICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0KXsNCiAgICAgICAgICAgIC8vIG5lZWQgcmVzZXQgbm9kZXMNCiAgICAgICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRBY3RpdmUgPT09IHRydWUpew0KICAgICAgICAgICAgICByZXNldCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmKHJlc2V0KXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub2RlU2VsZWN0IitkYXRhLmlkKS52YWx1ZSA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5vZGVTZWxlY3QiK2RhdGEuaWQpLm9uY2hhbmdlKCk7DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIC8vIGNvbGxhcHNlIGluaXQNCiAgICAgICAgICBpZihkYXRhLm9wdGlvbnMuY29sbGFwc2UgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICBlbC5jb2xsYXBzZSA9IGRhdGEub3B0aW9ucy5jb2xsYXBzZS5lbmFibGVkOw0KICAgICAgICAgICAgZWwuY29sbGFwc2VGaXQgPSBkYXRhLm9wdGlvbnMuY29sbGFwc2UuZml0Ow0KICAgICAgICAgICAgZWwuY29sbGFwc2VSZXNldEhpZ2hsaWdodCA9IGRhdGEub3B0aW9ucy5jb2xsYXBzZS5yZXNldEhpZ2hsaWdodDsNCiAgICAgICAgICAgIGVsLmNsdXN0ZXJPcHRpb25zID0gZGF0YS5vcHRpb25zLmNvbGxhcHNlLmNsdXN0ZXJPcHRpb25zOw0KICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgICAvLyBoaWdobGlnaHQgaW5pdA0KICAgICAgICAgIGlmKGRhdGEub3B0aW9ucy5oaWdobGlnaHQgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICBlbC5oaWdobGlnaHQgPSBkYXRhLm9wdGlvbnMuaGlnaGxpZ2h0LmVuYWJsZWQ7DQogICAgICAgICAgICBlbC5kZWdyZWUgPSBkYXRhLm9wdGlvbnMuaGlnaGxpZ2h0LmRlZ3JlZTsNCiAgICAgICAgICAgIGVsLmhvdmVyTmVhcmVzdCA9IGRhdGEub3B0aW9ucy5oaWdobGlnaHQuaG92ZXJOZWFyZXN0Ow0KICAgICAgICAgICAgZWwuaGlnaGxpZ2h0Q29sb3IgPSBkYXRhLm9wdGlvbnMuaGlnaGxpZ2h0LmhpZGVDb2xvcjsNCiAgICAgICAgICAgIGVsLmhpZ2hsaWdodEFsZ29yaXRobSA9IGRhdGEub3B0aW9ucy5oaWdobGlnaHQuYWxnb3JpdGhtOw0KICAgICAgICAgICAgZWwuaGlnaGxpZ2h0TGFiZWxPbmx5ID0gZGF0YS5vcHRpb25zLmxhYmVsT25seTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBieXNlbGVjdGlvbiBpbml0DQogICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmJ5c2VsZWN0aW9uICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmJ5c2VsZWN0aW9uLnNlbGVjdGVkICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VsZWN0ZWRCeSIrZGF0YS5pZCkudmFsdWUgPSBkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24uc2VsZWN0ZWQ7DQogICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RlZEJ5IitkYXRhLmlkKS5vbmNoYW5nZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmJ5c2VsZWN0aW9uLmhpZGVDb2xvcil7DQogICAgICAgICAgICAgIGVsLmJ5c2VsZWN0aW9uQ29sb3IgPSBkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24uaGlkZUNvbG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgICBpZihkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24gIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICBzZWxlY3RMaXN0MiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RlZEJ5IitkYXRhLmlkKQ0KICAgICAgICAgICAgc2VsZWN0TGlzdDIub3B0aW9ucy5sZW5ndGggPSAwOw0KICAgICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmJ5c2VsZWN0aW9uLmVuYWJsZWQgPT09IHRydWUpew0KICAgICAgICAgICAgICBvcHRpb24yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7DQogICAgICAgICAgICAgIG9wdGlvbjIudmFsdWUgPSAiIjsNCiAgICAgICAgICAgICAgb3B0aW9uMi50ZXh0ID0gIlNlbGVjdCBieSAiICsgZGF0YS5vcHRpb25zLmJ5c2VsZWN0aW9uLnZhcmlhYmxlOw0KICAgICAgICAgICAgICBzZWxlY3RMaXN0Mi5hcHBlbmRDaGlsZChvcHRpb24yKTsNCiAgICAgIA0KICAgICAgICAgICAgICBpZihkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24udmFsdWVzICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5vcHRpb25zLmJ5c2VsZWN0aW9uLnZhbHVlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgb3B0aW9uMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOw0KICAgICAgICAgICAgICAgICAgb3B0aW9uMi52YWx1ZSA9IGRhdGEub3B0aW9ucy5ieXNlbGVjdGlvbi52YWx1ZXNbaV07DQogICAgICAgICAgICAgICAgICBvcHRpb24yLnRleHQgPSBkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24udmFsdWVzW2ldOw0KICAgICAgICAgICAgICAgICAgc2VsZWN0TGlzdDIuYXBwZW5kQ2hpbGQob3B0aW9uMik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICBkb19sb29wX2J5ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgIGVsLmJ5c2VsZWN0aW9uX3ZhcmlhYmxlID0gZGF0YS5vcHRpb25zLmJ5c2VsZWN0aW9uLnZhcmlhYmxlOw0KICAgICAgICAgICAgICBlbC5ieXNlbGVjdGlvbl9tdWx0aXBsZSA9IGRhdGEub3B0aW9ucy5ieXNlbGVjdGlvbi5tdWx0aXBsZTsNCiAgICAgICAgICAgICAgc2VsZWN0TGlzdDIuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnOw0KICAgICAgICAgICAgICBpZihkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24uc3R5bGUgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICAgICAgc2VsZWN0TGlzdDIuc2V0QXR0cmlidXRlKCdzdHlsZScsIGRhdGEub3B0aW9ucy5ieXNlbGVjdGlvbi5zdHlsZSk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgZWwuYnlzZWxlY3Rpb24gPSB0cnVlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgc2VsZWN0TGlzdDIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgICAgZWwuYnlzZWxlY3Rpb24gPSBmYWxzZTsNCiAgICAgICAgICAgICAgLy8gcmVzZXQgc2VsZWN0aW9uDQogICAgICAgICAgICAgIGlmKGVsLnNlbGVjdEFjdGl2ZSA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2RhdGEuaWQpLnZhbHVlID0gIiI7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2RhdGEuaWQpLm9uY2hhbmdlKCk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIC8vIHJlc2V0IHNlbGVjdGlvbg0KICAgICAgICAgICAgaWYoZWwuc2VsZWN0QWN0aXZlID09PSB0cnVlKXsNCiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2RhdGEuaWQpLnZhbHVlID0gIiI7DQogICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RlZEJ5IitkYXRhLmlkKS5vbmNoYW5nZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgICBpZihkb19sb29wX2J5KXsNCiAgICAgICAgICAgICAgdmFyIGFsbE5vZGVzID0gZ3JhcGgubm9kZXMuZ2V0KHtyZXR1cm5UeXBlOiJPYmplY3QifSk7DQogICAgICAgICAgICAgIHZhciBieXNlbGVjdGlvbl92YWx1ZXMgPSBbXTsNCiAgICAgICAgICAgICAgZm9yICh2YXIgbm9kZUlkIGluIGFsbE5vZGVzKSB7DQogICAgICAgICAgICAgICAgaWYoZG9fbG9vcF9ieSl7DQogICAgICAgICAgICAgICAgICB2YXIgY3VycmVudF9zZWxfdmFsdWUgPSBhbGxOb2Rlc1tub2RlSWRdW2RhdGEub3B0aW9ucy5ieXNlbGVjdGlvbi52YXJpYWJsZV07DQogICAgICAgICAgICAgICAgICBpZihkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24ubXVsdGlwbGUpew0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NlbF92YWx1ZSA9IGN1cnJlbnRfc2VsX3ZhbHVlLnNwbGl0KCIsIikubWFwKEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnRyaW0pOw0KICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfc2VsX3ZhbHVlID0gW2N1cnJlbnRfc2VsX3ZhbHVlXTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGZvcih2YXIgaW5kX2MgaW4gY3VycmVudF9zZWxfdmFsdWUpew0KICAgICAgICAgICAgICAgICAgICBpZihpbmRleE9mLmNhbGwoYnlzZWxlY3Rpb25fdmFsdWVzLCBjdXJyZW50X3NlbF92YWx1ZVtpbmRfY10sIGZhbHNlKSA9PT0gLTEpew0KICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTsNCiAgICAgICAgICAgICAgICAgICAgICBvcHRpb24yLnZhbHVlID0gY3VycmVudF9zZWxfdmFsdWVbaW5kX2NdOw0KICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbjIudGV4dCA9IGN1cnJlbnRfc2VsX3ZhbHVlW2luZF9jXTsNCiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RMaXN0Mi5hcHBlbmRDaGlsZChvcHRpb24yKTsNCiAgICAgICAgICAgICAgICAgICAgICBieXNlbGVjdGlvbl92YWx1ZXMucHVzaChjdXJyZW50X3NlbF92YWx1ZVtpbmRfY10pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9IA0KICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgICAvLyBub2RlIGlkIHNlbGVjdGlvbiBpbml0DQogICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmlkc2VsZWN0aW9uICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgc2VsZWN0TGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub2RlU2VsZWN0IitkYXRhLmlkKQ0KICAgICAgICAgICAgc2VsZWN0TGlzdC5vcHRpb25zLmxlbmd0aCA9IDA7DQogICAgICAgICAgICBpZihkYXRhLm9wdGlvbnMuaWRzZWxlY3Rpb24uZW5hYmxlZCA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgIHNldE5vZGVJZExpc3Qoc2VsZWN0TGlzdCwgZGF0YS5vcHRpb25zLmlkc2VsZWN0aW9uLCBncmFwaC5ub2RlcykNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIHNlbGVjdExpc3Quc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgICAgZWwuaWRzZWxlY3Rpb24gPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGRhdGEub3B0aW9ucy5pZHNlbGVjdGlvbi51c2VMYWJlbHMgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICAgIGVsLmlkc2VsZWN0aW9uX3VzZUxhYmVscyA9IGRhdGEub3B0aW9ucy5pZHNlbGVjdGlvbi51c2VMYWJlbHMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgDQogICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmlkc2VsZWN0aW9uICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmlkc2VsZWN0aW9uLmVuYWJsZWQgPT09IHRydWUgJiYgZGF0YS5vcHRpb25zLmlkc2VsZWN0aW9uLnNlbGVjdGVkICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZGF0YS5pZCkudmFsdWUgPSBkYXRhLm9wdGlvbnMuaWRzZWxlY3Rpb24uc2VsZWN0ZWQ7DQogICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub2RlU2VsZWN0IitkYXRhLmlkKS5vbmNoYW5nZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICB9Ow0KICAgICAgDQogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueUN1c3RvbU9wdGlvbnMnLCB1cGRhdGVWaXNPcHRpb25zKTsNCiAgDQogIC8vIHVkcGF0ZSBub2RlcyBkYXRhDQogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueVVwZGF0ZU5vZGVzJywgZnVuY3Rpb24oZGF0YSl7DQogICAgICAvLyBnZXQgY29udGFpbmVyIGlkDQogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOw0KICAgICAgdmFyIG1haW5fZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkYXRhLmlkKTsNCiAgICAgIA0KICAgICAgaWYoZGF0YS5sZWdlbmQgPT09IGZhbHNlKXsNCiAgICAgICAgaWYoZWwpew0KICAgICAgICAgIC8vIGdldCAmIHRyYW5zZm9ybSBub2RlcyBvYmplY3QNCiAgICAgICAgICB2YXIgdG1wbm9kZXMgPSB2aXNOZXR3b3JrZGF0YWZyYW1lVG9EMyhkYXRhLm5vZGVzLCAibm9kZXMiKTsNCiAgICAgICAgICANCiAgICAgICAgICAvLyByZXNldCBzb21lIHBhcmFtZXRlcnMgLyBkYXRhIGJlZm9yZQ0KICAgICAgICAgIGlmIChtYWluX2VsLnNlbGVjdEFjdGl2ZSA9PT0gdHJ1ZSB8IG1haW5fZWwuaGlnaGxpZ2h0QWN0aXZlID09PSB0cnVlKSB7DQogICAgICAgICAgICAvL3Jlc2V0IG5vZGVzDQogICAgICAgICAgICByZXNldEFsbE5vZGVzKGVsLm5vZGVzLCB0cnVlLCBlbC5jaGFydC5ncm91cHMsIGVsLm9wdGlvbnMsIGVsLmNoYXJ0KTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKG1haW5fZWwuc2VsZWN0QWN0aXZlID09PSB0cnVlKXsNCiAgICAgICAgICAgICAgbWFpbl9lbC5zZWxlY3RBY3RpdmUgPSBmYWxzZTsNCiAgICAgICAgICAgICAgcmVzZXRMaXN0KCdzZWxlY3RlZEJ5JywgZGF0YS5pZCwgJ3NlbGVjdGVkQnknKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChtYWluX2VsLmhpZ2hsaWdodEFjdGl2ZSA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgIG1haW5fZWwuaGlnaGxpZ2h0QWN0aXZlID0gZmFsc2U7DQogICAgICAgICAgICAgIHJlc2V0TGlzdCgnbm9kZVNlbGVjdCcsIGRhdGEuaWQsICdzZWxlY3RlZCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICAvLyB1cGRhdGUgbm9kZXMNCiAgICAgICAgICBlbC5ub2Rlcy51cGRhdGUodG1wbm9kZXMpOw0KICAgICAgICAgIA0KICAgICAgICAgIC8vIHVwZGF0ZSBvcHRpb25zID8NCiAgICAgICAgICBpZihkYXRhLnVwZGF0ZU9wdGlvbnMpew0KICAgICAgICAgICAgdmFyIGRhdGFPcHRpb25zID0ge307DQogICAgICAgICAgICBkYXRhT3B0aW9ucy5vcHRpb25zID0ge307DQogICAgICAgICAgDQogICAgICAgICAgICB2YXIgdXBkYXRlT3B0cyA9IGZhbHNlOw0KICAgICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5vZGVTZWxlY3QiK2RhdGEuaWQpLnN0eWxlLmRpc3BsYXkgPT09ICdpbmxpbmUnKXsNCiAgICAgICAgICAgICAgdXBkYXRlT3B0cyA9IHRydWU7DQogICAgICAgICAgICAgIGRhdGFPcHRpb25zLmlkICA9IGRhdGEuaWQ7DQogICAgICAgICAgICAgIGRhdGFPcHRpb25zLm9wdGlvbnMuaWRzZWxlY3Rpb24gPSB7ZW5hYmxlZCA6IHRydWUsIHVzZUxhYmVscyA6IG1haW5fZWwuaWRzZWxlY3Rpb25fdXNlTGFiZWxzfTsNCiAgICAgICAgICAgIH0NCiAgICAgIA0KICAgICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2RhdGEuaWQpLnN0eWxlLmRpc3BsYXkgPT09ICdpbmxpbmUnKXsNCiAgICAgICAgICAgICAgdXBkYXRlT3B0cyA9IHRydWU7DQogICAgICAgICAgICAgIGRhdGFPcHRpb25zLmlkICA9IGRhdGEuaWQ7DQogICAgICAgICAgICAgIGRhdGFPcHRpb25zLm9wdGlvbnMuYnlzZWxlY3Rpb24gPSB7ZW5hYmxlZCA6IHRydWUsIHZhcmlhYmxlIDogbWFpbl9lbC5ieXNlbGVjdGlvbl92YXJpYWJsZSwgbXVsdGlwbGUgOiBtYWluX2VsLmJ5c2VsZWN0aW9uX211bHRpcGxlfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgICAgIGlmKHVwZGF0ZU9wdHMpew0KICAgICAgICAgICAgICB1cGRhdGVWaXNPcHRpb25zKGRhdGFPcHRpb25zKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZihkYXRhLmxlZ2VuZCA9PT0gdHJ1ZSl7DQogICAgICAgIHZhciBsZWdlbmRfbmV0d29yayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsZWdlbmQiK2RhdGEuaWQpOw0KICAgICAgICBpZihsZWdlbmRfbmV0d29yayl7DQogICAgICAgICAgLy8gZ2V0ICYgdHJhbnNmb3JtIG5vZGVzIG9iamVjdA0KICAgICAgICAgIHZhciB0bXBub2RlcyA9IHZpc05ldHdvcmtkYXRhZnJhbWVUb0QzKGRhdGEubm9kZXMsICJub2RlcyIpOw0KICAgICAgICAgIC8vIHVwZGF0ZSBub2Rlcw0KICAgICAgICAgIGxlZ2VuZF9uZXR3b3JrLm5ldHdvcmsuYm9keS5kYXRhLm5vZGVzLnVwZGF0ZSh0bXBub2Rlcyk7DQogICAgICAgICAgLy8gZml0DQogICAgICAgICAgbGVnZW5kX25ldHdvcmsubmV0d29yay5maXQoKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICB9KTsNCg0KICAvLyB1ZHBhdGUgZWRnZXMgZGF0YQ0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlVcGRhdGVFZGdlcycsIGZ1bmN0aW9uKGRhdGEpew0KICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsNCiAgICAgIGlmKGRhdGEubGVnZW5kID09PSBmYWxzZSl7DQogICAgICAgIGlmKGVsKXsNCiAgICAgICAgICAvLyBnZXQgZWRnZXMgb2JqZWN0DQogICAgICAgICAgdmFyIHRtcGVkZ2VzID0gdmlzTmV0d29ya2RhdGFmcmFtZVRvRDMoZGF0YS5lZGdlcywgImVkZ2VzIik7DQogICAgICAgICAgLy8gcmVzZXQgZWRnZXMNCiAgICAgICAgICByZXNldEFsbEVkZ2VzKGVsLmVkZ2VzLCBlbC5oaWdobGlnaHRDb2xvciwgIGVsLmJ5c2VsZWN0aW9uQ29sb3IsIGVsLmNoYXJ0KQ0KICAgICAgICAgIGVsLmVkZ2VzLnVwZGF0ZSh0bXBlZGdlcyk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZihkYXRhLmxlZ2VuZCA9PT0gdHJ1ZSl7DQogICAgICAgIHZhciBsZWdlbmRfbmV0d29yayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsZWdlbmQiK2RhdGEuaWQpOw0KICAgICAgICBpZihsZWdlbmRfbmV0d29yayl7DQogICAgICAgICAgLy8gZ2V0ICYgdHJhbnNmb3JtIG5vZGVzIG9iamVjdA0KICAgICAgICAgIHZhciB0bXBlZGdlcyA9IHZpc05ldHdvcmtkYXRhZnJhbWVUb0QzKGRhdGEuZWRnZXMsICJlZGdlcyIpOw0KICAgICAgICAgIC8vIHVwZGF0ZSBlZGdlcw0KICAgICAgICAgIGxlZ2VuZF9uZXR3b3JrLm5ldHdvcmsuYm9keS5kYXRhLmVkZ2VzLnVwZGF0ZSh0bXBlZGdlcyk7DQogICAgICAgICAgLy8gZml0DQogICAgICAgICAgbGVnZW5kX25ldHdvcmsubmV0d29yay5maXQoKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIHJlbW92ZSBub2Rlcw0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlSZW1vdmVOb2RlcycsIGZ1bmN0aW9uKGRhdGEpew0KICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsNCiAgICAgIHZhciBtYWluX2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGF0YS5pZCk7DQogICAgICBpZihkYXRhLmxlZ2VuZCA9PT0gZmFsc2Upew0KICAgICAgICBpZihlbCl7DQogICAgICAgICAgLy8gcmVzZXQgc29tZSBwYXJhbWV0ZXJzIC8gZGF0ZSBiZWZvcmUNCiAgICAgICAgICBpZiAobWFpbl9lbC5zZWxlY3RBY3RpdmUgPT09IHRydWUgfCBtYWluX2VsLmhpZ2hsaWdodEFjdGl2ZSA9PT0gdHJ1ZSkgew0KICAgICAgICAgICAgLy9yZXNldCBub2Rlcw0KICAgICAgICAgICAgcmVzZXRBbGxOb2RlcyhlbC5ub2RlcywgdHJ1ZSwgZWwuY2hhcnQuZ3JvdXBzLCBlbC5vcHRpb25zLCBlbC5jaGFydCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmIChtYWluX2VsLnNlbGVjdEFjdGl2ZSA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgIG1haW5fZWwuc2VsZWN0QWN0aXZlID0gZmFsc2U7DQogICAgICAgICAgICAgIHJlc2V0TGlzdCgnc2VsZWN0ZWRCeScsIGRhdGEuaWQsICdzZWxlY3RlZEJ5Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobWFpbl9lbC5oaWdobGlnaHRBY3RpdmUgPT09IHRydWUpew0KICAgICAgICAgICAgICBtYWluX2VsLmhpZ2hsaWdodEFjdGl2ZSA9IGZhbHNlOw0KICAgICAgICAgICAgICByZXNldExpc3QoJ25vZGVTZWxlY3QnLCBkYXRhLmlkLCAnc2VsZWN0ZWQnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgLy8gcmVtb3ZlIG5vZGVzDQogICAgICAgICAgZWwubm9kZXMucmVtb3ZlKGRhdGEucm1pZCk7DQogIA0KICAgICAgICAgIC8vIHVwZGF0ZSBvcHRpb25zID8NCiAgICAgICAgICBpZihkYXRhLnVwZGF0ZU9wdGlvbnMpew0KICAgICAgICAgICAgdmFyIGRhdGFPcHRpb25zID0ge307DQogICAgICAgICAgICBkYXRhT3B0aW9ucy5vcHRpb25zID0ge307DQogICAgICAgICAgDQogICAgICAgICAgICB2YXIgdXBkYXRlT3B0cyA9IGZhbHNlOw0KICAgICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5vZGVTZWxlY3QiK2RhdGEuaWQpLnN0eWxlLmRpc3BsYXkgPT09ICdpbmxpbmUnKXsNCiAgICAgICAgICAgICAgdXBkYXRlT3B0cyA9IHRydWU7DQogICAgICAgICAgICAgIGRhdGFPcHRpb25zLmlkICA9IGRhdGEuaWQ7DQogICAgICAgICAgICAgIGRhdGFPcHRpb25zLm9wdGlvbnMuaWRzZWxlY3Rpb24gPSB7ZW5hYmxlZCA6IHRydWUsIHVzZUxhYmVscyA6IG1haW5fZWwuaWRzZWxlY3Rpb25fdXNlTGFiZWxzfTsNCiAgICAgICAgICAgIH0NCiAgICAgIA0KICAgICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2RhdGEuaWQpLnN0eWxlLmRpc3BsYXkgPT09ICdpbmxpbmUnKXsNCiAgICAgICAgICAgICAgdXBkYXRlT3B0cyA9IHRydWU7DQogICAgICAgICAgICAgIGRhdGFPcHRpb25zLmlkICA9IGRhdGEuaWQ7DQogICAgICAgICAgICAgIGRhdGFPcHRpb25zLm9wdGlvbnMuYnlzZWxlY3Rpb24gPSB7ZW5hYmxlZCA6IHRydWUsIHZhcmlhYmxlIDogbWFpbl9lbC5ieXNlbGVjdGlvbl92YXJpYWJsZSwgbXVsdGlwbGUgOiBtYWluX2VsLmJ5c2VsZWN0aW9uX211bHRpcGxlfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgICAgIGlmKHVwZGF0ZU9wdHMpew0KICAgICAgICAgICAgICB1cGRhdGVWaXNPcHRpb25zKGRhdGFPcHRpb25zKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZihkYXRhLmxlZ2VuZCA9PT0gdHJ1ZSl7DQogICAgICAgIHZhciBsZWdlbmRfbmV0d29yayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsZWdlbmQiK2RhdGEuaWQpOw0KICAgICAgICBpZihsZWdlbmRfbmV0d29yayl7DQogICAgICAgICAgLy8gcmVtb3ZlIG5vZGVzDQogICAgICAgICAgbGVnZW5kX25ldHdvcmsubmV0d29yay5ib2R5LmRhdGEubm9kZXMucmVtb3ZlKGRhdGEucm1pZCk7DQogICAgICAgICAgLy8gZml0DQogICAgICAgICAgbGVnZW5kX25ldHdvcmsubmV0d29yay5maXQoKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIHJlbW92ZSBlZGdlcw0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlSZW1vdmVFZGdlcycsIGZ1bmN0aW9uKGRhdGEpew0KICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZA0KICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsNCiAgICAgIGlmKGRhdGEubGVnZW5kID09PSBmYWxzZSl7DQogICAgICAgIGlmKGVsKXsNCiAgICAgICAgICAvLyByZXNldCBlZGdlcw0KICAgICAgICAgIHJlc2V0QWxsRWRnZXMoZWwuZWRnZXMsIGVsLmhpZ2hsaWdodENvbG9yLCAgZWwuYnlzZWxlY3Rpb25Db2xvciwgZWwuY2hhcnQpDQogICAgICAgICAgZWwuZWRnZXMucmVtb3ZlKGRhdGEucm1pZCk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZihkYXRhLmxlZ2VuZCA9PT0gdHJ1ZSl7DQogICAgICAgIHZhciBsZWdlbmRfbmV0d29yayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsZWdlbmQiK2RhdGEuaWQpOw0KICAgICAgICBpZihsZWdlbmRfbmV0d29yayl7DQogICAgICAgICAgLy8gcmVtb3ZlIGVkZ2VzDQogICAgICAgICAgbGVnZW5kX25ldHdvcmsubmV0d29yay5ib2R5LmRhdGEuZWRnZXMucmVtb3ZlKGRhdGEucm1pZCk7DQogICAgICAgICAgLy8gZml0DQogICAgICAgICAgbGVnZW5kX25ldHdvcmsubmV0d29yay5maXQoKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICB9KTsNCiAgDQogIC8vIHJlbW92ZSBlZGdlcw0KICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlTZXRUaXRsZScsIGZ1bmN0aW9uKGRhdGEpew0KICAgIGlmKGRhdGEubWFpbiAhPT0gbnVsbCl7DQogICAgICB2YXIgZGl2X3RpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpdGxlIiArIGRhdGEuaWQpOw0KICAgICAgaWYoZGl2X3RpdGxlICE9PSBudWxsKXsNCiAgICAgICAgaWYoZGF0YS5tYWluLmhpZGRlbiA9PT0gdHJ1ZSl7DQogICAgICAgICAgZGl2X3RpdGxlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgaWYoZGF0YS5tYWluLnRleHQgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICBpZihkYXRhLm1haW4udGV4dCAhPT0gbnVsbCl7DQogICAgICAgICAgICAgIGlmKGRhdGEubWFpbi50ZXh0Lmxlbmd0aCA+IDApew0KICAgICAgICAgICAgICAgIGRpdl90aXRsZS5pbm5lckhUTUwgPSBkYXRhLm1haW4udGV4dDsNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBkaXZfdGl0bGUuaW5uZXJIVE1MID0gIiI7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgaWYoZGF0YS5tYWluLnN0eWxlICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgaWYoZGF0YS5tYWluLnN0eWxlICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgaWYoZGF0YS5tYWluLnN0eWxlLmxlbmd0aCA+IDApew0KICAgICAgICAgICAgICAgIGRpdl90aXRsZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgIGRhdGEubWFpbi5zdHlsZSk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgZGl2X3RpdGxlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICB9IA0KICAgICAgfQ0KICAgIH0NCiAgICBpZihkYXRhLnN1Ym1haW4gIT09IG51bGwpew0KICAgICAgdmFyIGRpdl9zdWJ0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdWJ0aXRsZSIgKyBkYXRhLmlkKTsNCiAgICAgIGlmKGRpdl9zdWJ0aXRsZSAhPT0gbnVsbCl7DQogICAgICAgIGlmKGRhdGEuc3VibWFpbi5oaWRkZW4gPT09IHRydWUpew0KICAgICAgICAgIGRpdl9zdWJ0aXRsZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGlmKGRhdGEuc3VibWFpbi50ZXh0ICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgaWYoZGF0YS5zdWJtYWluLnRleHQgIT09IG51bGwpew0KICAgICAgICAgICAgICBpZihkYXRhLnN1Ym1haW4udGV4dC5sZW5ndGggPiAwKXsNCiAgICAgICAgICAgICAgICBkaXZfc3VidGl0bGUuaW5uZXJIVE1MID0gZGF0YS5zdWJtYWluLnRleHQ7DQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZGl2X3N1YnRpdGxlLmlubmVySFRNTCA9ICIiOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmKGRhdGEuc3VibWFpbi5zdHlsZSAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgIGlmKGRhdGEuc3VibWFpbi5zdHlsZSAhPT0gbnVsbCl7DQogICAgICAgICAgICAgIGlmKGRhdGEuc3VibWFpbi5zdHlsZS5sZW5ndGggPiAwKXsNCiAgICAgICAgICAgICAgICBkaXZfc3VidGl0bGUuc2V0QXR0cmlidXRlKCdzdHlsZScsICBkYXRhLnN1Ym1haW4uc3R5bGUpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGRpdl9zdWJ0aXRsZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBpZihkYXRhLmZvb3RlciAhPT0gbnVsbCl7DQogICAgICB2YXIgZGl2X2Zvb3RlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb290ZXIiICsgZGF0YS5pZCk7DQogICAgICBpZihkaXZfZm9vdGVyICE9PSBudWxsKXsNCiAgICAgICAgaWYoZGF0YS5mb290ZXIuaGlkZGVuID09PSB0cnVlKXsNCiAgICAgICAgICBkaXZfZm9vdGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgaWYoZGF0YS5mb290ZXIudGV4dCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgIGlmKGRhdGEuZm9vdGVyLnRleHQgIT09IG51bGwpew0KICAgICAgICAgICAgICBpZihkYXRhLmZvb3Rlci50ZXh0Lmxlbmd0aCA+IDApew0KICAgICAgICAgICAgICAgIGRpdl9mb290ZXIuaW5uZXJIVE1MID0gZGF0YS5mb290ZXIudGV4dDsNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBkaXZfZm9vdGVyLmlubmVySFRNTCA9ICIiOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmKGRhdGEuZm9vdGVyLnN0eWxlICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgaWYoZGF0YS5mb290ZXIuc3R5bGUgIT09IG51bGwpew0KICAgICAgICAgICAgICBpZihkYXRhLmZvb3Rlci5zdHlsZS5sZW5ndGggPiAwKXsNCiAgICAgICAgICAgICAgICBkaXZfZm9vdGVyLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAgZGF0YS5mb290ZXIuc3R5bGUpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGRpdl9mb290ZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICAgIH0gDQogICAgICB9DQogICAgfQ0KICB9KTsNCg0KICAvLyB1cGRhdGVUcmVlDQogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueVVwZGF0ZVRyZWUnLCBmdW5jdGlvbihkYXRhKXsNCiAgICAgIC8vIGdldCBjb250YWluZXIgaWQNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEuaWQpOw0KICAgICAgaWYoZWwpew0KICAgICAgICBpZihkYXRhLnRyZWUudXBkYXRlU2hhcGUgIT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICBlbC50cmVlLnVwZGF0ZVNoYXBlID0gZGF0YS50cmVlLnVwZGF0ZVNoYXBlDQogICAgICAgIH0NCiAgICAgICAgaWYoZGF0YS50cmVlLnNoYXBlVmFyICE9IHVuZGVmaW5lZCl7DQogICAgICAgICAgZWwudHJlZS5zaGFwZVZhciA9IGRhdGEudHJlZS5zaGFwZVZhcg0KICAgICAgICB9DQogICAgICAgIGlmKGRhdGEudHJlZS5zaGFwZVkgIT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICBlbC50cmVlLnNoYXBlWSA9IGRhdGEudHJlZS5zaGFwZVkNCiAgICAgICAgfQ0KICAgICAgfQ0KICB9KTsNCn0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBIVE1MV2lkZ2V0cy53aWRnZXQgRGVmaW5pdGlvbg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQpIVE1MV2lkZ2V0cy53aWRnZXQoew0KICANCiAgbmFtZTogJ3Zpc05ldHdvcmsnLA0KICANCiAgdHlwZTogJ291dHB1dCcsDQogIA0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KICAgIHJldHVybiB7DQogICAgfTsNCiAgfSwNCiAgDQogIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsNCiAgICB2YXIgZGF0YTsNCiAgICB2YXIgbm9kZXM7DQogICAgdmFyIGVkZ2VzOw0KDQoNCiAgICAvLyBjbHVzdGVyZ2luIGJ5IHpvb20gdmFyaWFibGVzDQogICAgdmFyIGNsdXN0ZXJJbmRleCA9IDA7DQogICAgdmFyIGNsdXN0ZXJzID0gW107DQogICAgdmFyIGxhc3RDbHVzdGVyWm9vbUxldmVsID0gMDsNCiAgICB2YXIgY2x1c3RlckZhY3RvcjsNCiAgICB2YXIgY3RybHdhaXQgPSAwOw0KICAgIA0KICAgIC8vIGxlZ2VuZCBjb250cm9sDQogICAgdmFyIGFkZGxlZ2VuZCA9IGZhbHNlOw0KDQogICAgLy8gY2xlYXIgZWwuaWQgKGZvciBzaGlueS4uLikNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaW5uZXJIVE1MID0gIiI7ICANCiAgICANCiAgICAvLyBzaGFyZWQgY29udHJvbCB3aXRoIHByb3h5IGZ1bmN0aW9uIChpcyB0aGVyZSBhIGJldHRlciB3YXkgPykNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0QWN0aXZlID0gZmFsc2U7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLnNlbGVjdEFjdGl2ZSA9IGZhbHNlOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5pZHNlbGVjdGlvbiA9IHguaWRzZWxlY3Rpb24uZW5hYmxlZDsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb24gPSB4LmJ5c2VsZWN0aW9uLmVuYWJsZWQ7DQogICAgDQogICAgaWYoeC5oaWdobGlnaHQgIT09IHVuZGVmaW5lZCl7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0ID0geC5oaWdobGlnaHQuZW5hYmxlZDsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRDb2xvciA9IHguaGlnaGxpZ2h0LmhpZGVDb2xvcjsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ob3Zlck5lYXJlc3QgPSB4LmhpZ2hsaWdodC5ob3Zlck5lYXJlc3Q7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuZGVncmVlID0geC5oaWdobGlnaHQuZGVncmVlOw0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodEFsZ29yaXRobSA9IHguaGlnaGxpZ2h0LmFsZ29yaXRobTsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRMYWJlbE9ubHkgPSB4LmhpZ2hsaWdodC5sYWJlbE9ubHk7DQogICAgfSBlbHNlIHsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHQgPSBmYWxzZTsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ob3Zlck5lYXJlc3QgPSBmYWxzZTsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRDb2xvciA9ICdyZ2JhKDIwMCwyMDAsMjAwLDAuNSknOw0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmRlZ3JlZSA9IDE7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0QWxnb3JpdGhtID0gImFsbCI7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0TGFiZWxPbmx5ID0gdHJ1ZTsNCiAgICB9DQoNCiAgICBpZih4LmJ5c2VsZWN0aW9uLmVuYWJsZWQpew0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uQ29sb3IgPSB4LmJ5c2VsZWN0aW9uLmhpZGVDb2xvcjsNCiAgICB9IGVsc2Ugew0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uQ29sb3IgPSAncmdiYSgyMDAsMjAwLDIwMCwwLjUpJzsNCiAgICB9DQogICAgDQogICAgaWYoeC5pZHNlbGVjdGlvbi5lbmFibGVkKXsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5pZHNlbGVjdGlvbl91c2VMYWJlbHMgPSB0cnVlOw0KICAgIH0gZWxzZSB7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaWRzZWxlY3Rpb25fdXNlTGFiZWxzID0gZmFsc2U7DQogICAgfQ0KICAgIA0KICAgIGlmKHguY29sbGFwc2UgIT09IHVuZGVmaW5lZCl7DQogICAgICBpZih4LmNvbGxhcHNlLmVuYWJsZWQpew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuY29sbGFwc2UgPSB0cnVlOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuY29sbGFwc2VGaXQgPSB4LmNvbGxhcHNlLmZpdDsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmNvbGxhcHNlUmVzZXRIaWdobGlnaHQgPSB4LmNvbGxhcHNlLnJlc2V0SGlnaGxpZ2h0Ow0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuY2x1c3Rlck9wdGlvbnMgPSB4LmNvbGxhcHNlLmNsdXN0ZXJPcHRpb25zOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuY29sbGFwc2UgPSBmYWxzZTsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5jb2xsYXBzZUZpdCA9IGZhbHNlOw0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmNvbGxhcHNlUmVzZXRIaWdobGlnaHQgPSBmYWxzZTsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5jbHVzdGVyT3B0aW9ucyA9IHVuZGVmaW5lZDsNCiAgICB9DQogICAgDQogICAgaWYoeC50cmVlICE9PSB1bmRlZmluZWQpew0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLnRyZWUgPSB4LnRyZWU7DQogICAgfQ0KDQogICAgLy8gY29uZmlndXJlDQogICAgaWYoeC5vcHRpb25zLmNvbmZpZ3VyZSAhPT0gdW5kZWZpbmVkKXsNCiAgICAgIGlmKHgub3B0aW9ucy5jb25maWd1cmUuY29udGFpbmVyICE9PSB1bmRlZmluZWQpew0KICAgICAgICB2YXIgZG9tX2NvbmYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh4Lm9wdGlvbnMuY29uZmlndXJlLmNvbnRhaW5lcik7DQogICAgICAgIGlmKGRvbV9jb25mICE9PSBudWxsKXsNCiAgICAgICAgICB4Lm9wdGlvbnMuY29uZmlndXJlLmNvbnRhaW5lciA9IGRvbV9jb25mOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHgub3B0aW9ucy5jb25maWd1cmUuY29udGFpbmVyID0gdW5kZWZpbmVkOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICAgIA0KICAgIHZhciBjaGFuZ2VJbnB1dCA9IGZ1bmN0aW9uKGlkLCBkYXRhKSB7DQogICAgICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGVsLmlkICsgJ18nICsgaWQsIGRhdGEpOw0KICAgIH07DQogICAgICAgICAgDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgLy90aXRsZQ0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIHZhciBkaXZfdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICBkaXZfdGl0bGUuaWQgPSAidGl0bGUiK2VsLmlkOw0KICAgIGRpdl90aXRsZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywnZm9udC1mYW1pbHk6R2VvcmdpYSwgVGltZXMgTmV3IFJvbWFuLCBUaW1lcywgc2VyaWY7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXNpemU6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjsnKTsNCiAgICBkaXZfdGl0bGUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYXBwZW5kQ2hpbGQoZGl2X3RpdGxlKTsgIA0KICAgIGlmKHgubWFpbiAhPT0gbnVsbCl7DQogICAgICBkaXZfdGl0bGUuaW5uZXJIVE1MID0geC5tYWluLnRleHQ7DQogICAgICBkaXZfdGl0bGUuc2V0QXR0cmlidXRlKCdzdHlsZScsICB4Lm1haW4uc3R5bGUpOw0KICAgICAgZGl2X3RpdGxlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgIH0NCiAgICANCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAvL3N1YnRpdGxlDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgdmFyIGRpdl9zdWJ0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgIGRpdl9zdWJ0aXRsZS5pZCA9ICJzdWJ0aXRsZSIrZWwuaWQ7DQogICAgZGl2X3N1YnRpdGxlLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAgJ2ZvbnQtZmFtaWx5Okdlb3JnaWEsIFRpbWVzIE5ldyBSb21hbiwgVGltZXMsIHNlcmlmO2ZvbnQtc2l6ZToxMnB4O3RleHQtYWxpZ246Y2VudGVyOycpOw0KICAgIGRpdl9zdWJ0aXRsZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5hcHBlbmRDaGlsZChkaXZfc3VidGl0bGUpOyANCiAgICBpZih4LnN1Ym1haW4gIT09IG51bGwpew0KICAgICAgZGl2X3N1YnRpdGxlLmlubmVySFRNTCA9IHguc3VibWFpbi50ZXh0Ow0KICAgICAgZGl2X3N1YnRpdGxlLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAgeC5zdWJtYWluLnN0eWxlKTsNCiAgICAgIGRpdl90aXRsZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICB9DQogDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgLy9pbml0IGlkc2VsZWN0aW9uDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgZnVuY3Rpb24gb25JZENoYW5nZShpZCwgaW5pdCkgew0KICAgICAgaWYoaWQgPT09ICIiKXsNCiAgICAgICAgaW5zdGFuY2UubmV0d29yay5zZWxlY3ROb2RlcyhbXSk7DQogICAgICB9ZWxzZXsNCiAgICAgICAgaW5zdGFuY2UubmV0d29yay5zZWxlY3ROb2RlcyhbaWRdKTsNCiAgICAgIH0NCiAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHQpew0KICAgICAgICBuZWlnaGJvdXJob29kSGlnaGxpZ2h0KGluc3RhbmNlLm5ldHdvcmsuZ2V0U2VsZWN0aW9uKCkubm9kZXMsICJjbGljayIsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRBbGdvcml0aG0pOw0KICAgICAgfWVsc2V7DQogICAgICAgIGlmKGluaXQpew0KICAgICAgICAgIHNlbGVjdE5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm9kZVNlbGVjdCcrZWwuaWQpOw0KICAgICAgICAgIGlmKHguaWRzZWxlY3Rpb24udmFsdWVzICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgaWYoaW5kZXhPZi5jYWxsKHguaWRzZWxlY3Rpb24udmFsdWVzLCBpZCwgdHJ1ZSkgPiAtMSl7DQogICAgICAgICAgICAgIHNlbGVjdE5vZGUudmFsdWUgPSBpZDsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICBzZWxlY3ROb2RlLnZhbHVlID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBzZWxlY3ROb2RlLnZhbHVlID0gaWQ7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAod2luZG93LlNoaW55KXsNCiAgICAgICAgY2hhbmdlSW5wdXQoJ3NlbGVjdGVkJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5vZGVTZWxlY3QiK2VsLmlkKS52YWx1ZSk7DQogICAgICB9DQogICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb24pew0KICAgICAgICByZXNldExpc3QoJ3NlbGVjdGVkQnknLCBlbC5pZCwgJ3NlbGVjdGVkQnknKTsNCiAgICAgIH0NCiAgICB9DQogICAgICANCiAgICAvLyBpZCBub2RlcyBzZWxlY3Rpb24gOiBhZGQgYSBsaXN0IG9uIHRvcCBsZWZ0DQogICAgLy8gYWN0dWFsbHkgb25seSB3aXRoIG5vZGVzICsgZWRnZXMgZGF0YSAobm90IGRvdCBhbmQgZ2VwaGkpDQogICAgdmFyIGlkTGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOw0KICAgIGlkTGlzdC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2Ryb3Bkb3duJyk7DQogICAgaWRMaXN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgaWRMaXN0LmlkID0gIm5vZGVTZWxlY3QiK2VsLmlkOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5hcHBlbmRDaGlsZChpZExpc3QpOw0KICAgICAgDQogICAgaWRMaXN0Lm9uY2hhbmdlID0gIGZ1bmN0aW9uKCl7DQogICAgICBpZihpbnN0YW5jZS5uZXR3b3JrKXsNCiAgICAgICAgb25JZENoYW5nZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZWwuaWQpLnZhbHVlLCBmYWxzZSk7DQogICAgICB9DQogICAgfTsNCiAgICAgIA0KICAgIHZhciBociA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImhyIik7DQogICAgaHIuc2V0QXR0cmlidXRlKCdzdHlsZScsICdoZWlnaHQ6MHB4OyB2aXNpYmlsaXR5OmhpZGRlbjsgbWFyZ2luLWJvdHRvbTotMXB4OycpOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5hcHBlbmRDaGlsZChocik7ICANCiAgICAgIA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vc2VsZWN0ZWRCeQ0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIGZ1bmN0aW9uIG9uQnlDaGFuZ2UodmFsdWUpIHsNCiAgICAgICAgaWYoaW5zdGFuY2UubmV0d29yayl7DQogICAgICAgICAgc2VsZWN0ZWRIaWdobGlnaHQodmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIGlmICh3aW5kb3cuU2hpbnkpew0KICAgICAgICAgIGNoYW5nZUlucHV0KCdzZWxlY3RlZEJ5JywgdmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5pZHNlbGVjdGlvbil7DQogICAgICAgICAgcmVzZXRMaXN0KCdub2RlU2VsZWN0JywgZWwuaWQsICdzZWxlY3RlZCcpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIC8vIHNlbGVjdGVkQnkgOiBhZGQgYSBsaXN0IG9uIHRvcCBsZWZ0DQogICAgLy8gYWN0dWFsbHkgb25seSB3aXRoIG5vZGVzICsgZWRnZXMgZGF0YSAobm90IGRvdCBhbmQgZ2VwaGkpDQogICAgLy9DcmVhdGUgYW5kIGFwcGVuZCBzZWxlY3QgbGlzdA0KICAgIHZhciBieUxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsNCiAgICBieUxpc3Quc2V0QXR0cmlidXRlKCdjbGFzcycsICdkcm9wZG93bicpOw0KICAgIGJ5TGlzdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgIGJ5TGlzdC5pZCA9ICJzZWxlY3RlZEJ5IitlbC5pZDsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYXBwZW5kQ2hpbGQoYnlMaXN0KTsNCg0KICAgIGJ5TGlzdC5vbmNoYW5nZSA9ICBmdW5jdGlvbigpew0KICAgICAgb25CeUNoYW5nZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VsZWN0ZWRCeSIrZWwuaWQpLnZhbHVlKTsNCiAgICB9Ow0KICAgICAgDQogICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uKXsNCg0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uX3ZhbHVlcyA9IHguYnlzZWxlY3Rpb24udmFsdWVzOw0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uX3ZhcmlhYmxlID0geC5ieXNlbGVjdGlvbi52YXJpYWJsZTsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ieXNlbGVjdGlvbl9tdWx0aXBsZSA9IHguYnlzZWxlY3Rpb24ubXVsdGlwbGU7DQogICAgICB2YXIgb3B0aW9uMjsNCiAgICAgIA0KICAgICAgLy9DcmVhdGUgYW5kIGFwcGVuZCBzZWxlY3QgbGlzdA0KICAgICAgdmFyIHNlbGVjdExpc3QyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2VsLmlkKTsNCiAgICAgIHNlbGVjdExpc3QyLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCB4LmJ5c2VsZWN0aW9uLnN0eWxlKTsNCiAgICAgIHNlbGVjdExpc3QyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsNCiAgICAgIA0KICAgICAgb3B0aW9uMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOw0KICAgICAgb3B0aW9uMi52YWx1ZSA9ICIiOw0KICAgICAgb3B0aW9uMi50ZXh0ID0gIlNlbGVjdCBieSAiICsgeC5ieXNlbGVjdGlvbi52YXJpYWJsZTsNCiAgICAgIHNlbGVjdExpc3QyLmFwcGVuZENoaWxkKG9wdGlvbjIpOw0KICAgICAgDQogICAgICAvL0NyZWF0ZSBhbmQgYXBwZW5kIHRoZSBvcHRpb25zDQogICAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgeC5ieXNlbGVjdGlvbi52YWx1ZXMubGVuZ3RoOyBpMisrKSB7DQogICAgICAgIG9wdGlvbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTsNCiAgICAgICAgb3B0aW9uMi52YWx1ZSA9IHguYnlzZWxlY3Rpb24udmFsdWVzW2kyXTsNCiAgICAgICAgb3B0aW9uMi50ZXh0ID0geC5ieXNlbGVjdGlvbi52YWx1ZXNbaTJdOw0KICAgICAgICBzZWxlY3RMaXN0Mi5hcHBlbmRDaGlsZChvcHRpb24yKTsNCiAgICAgIH0NCiAgICAgIA0KICAgICAgaWYgKHdpbmRvdy5TaGlueSl7DQogICAgICAgIGNoYW5nZUlucHV0KCdzZWxlY3RlZEJ5JywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2VsLmlkKS52YWx1ZSk7DQogICAgICB9DQogICAgfQ0KICAgIA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vIHByZS10cmVhdG1lbnQgZm9yIGljb25zICh1bmljb2RlKQ0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIGlmKHgub3B0aW9ucy5ncm91cHMpew0KICAgICAgZm9yICh2YXIgZ3IgaW4geC5vcHRpb25zLmdyb3Vwcyl7DQogICAgICAgIGlmKHgub3B0aW9ucy5ncm91cHNbZ3JdLmljb24pew0KICAgICAgICAgIGlmKHgub3B0aW9ucy5ncm91cHNbZ3JdLmljb24uY29kZSl7DQogICAgICAgICAgICB4Lm9wdGlvbnMuZ3JvdXBzW2dyXS5pY29uLmNvZGUgPSBKU09OLnBhcnNlKCAnIicrJ1xcdScgKyB4Lm9wdGlvbnMuZ3JvdXBzW2dyXS5pY29uLmNvZGUgKyAnIicpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZih4Lm9wdGlvbnMuZ3JvdXBzW2dyXS5pY29uLmNvbG9yKXsNCiAgICAgICAgICAgIHgub3B0aW9ucy5ncm91cHNbZ3JdLmNvbG9yID0geC5vcHRpb25zLmdyb3Vwc1tncl0uaWNvbi5jb2xvcjsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgDQogICAgaWYoeC5vcHRpb25zLm5vZGVzLmljb24pew0KICAgICAgICBpZih4Lm9wdGlvbnMubm9kZXMuaWNvbi5jb2RlKXsNCiAgICAgICAgICB4Lm9wdGlvbnMubm9kZXMuaWNvbi5jb2RlID0gSlNPTi5wYXJzZSggJyInKydcXHUnICsgeC5vcHRpb25zLm5vZGVzLmljb24uY29kZSArICciJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYoeC5vcHRpb25zLm5vZGVzLmljb24uY29sb3Ipew0KICAgICAgICAgIHgub3B0aW9ucy5ub2Rlcy5jb2xvciA9IHgub3B0aW9ucy5ub2Rlcy5pY29uLmNvbG9yOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vcGFnZSBzdHJ1Y3R1cmUNCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICANCiAgICAvLyBkaXZpZGUgcGFnZQ0KICAgIHZhciBtYWluZGl2ICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgIG1haW5kaXYuaWQgPSAibWFpbmRpdiIrZWwuaWQ7DQogICAgbWFpbmRpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2hlaWdodDo5NSUnKTsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYXBwZW5kQ2hpbGQobWFpbmRpdik7DQogICAgDQogICAgdmFyIGdyYXBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgZ3JhcGguaWQgPSAiZ3JhcGgiK2VsLmlkOw0KICAgIA0KICAgIGlmKHgubGVnZW5kICE9PSB1bmRlZmluZWQpew0KICAgICAgaWYoKHguZ3JvdXBzICYmIHgubGVnZW5kLnVzZUdyb3VwcykgfHwgKHgubGVnZW5kLm5vZGVzICE9PSB1bmRlZmluZWQpIHx8ICh4LmxlZ2VuZC5lZGdlcyAhPT0gdW5kZWZpbmVkKSl7DQogICAgICAgIGFkZGxlZ2VuZCA9IHRydWU7DQogICAgICB9DQogICAgfQ0KICAgIA0KICAgIC8vbGVnZW5kDQogICAgaWYoYWRkbGVnZW5kKXsNCiAgICAgIHZhciBsZWdlbmR3aWR0aCA9IHgubGVnZW5kLndpZHRoKjEwMDsNCiAgICAgIHZhciBsZWdlbmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgIA0KICAgICAgdmFyIHBvcyA9IHgubGVnZW5kLnBvc2l0aW9uOw0KICAgICAgdmFyIHBvczIgPSAicmlnaHQiOw0KICAgICAgaWYocG9zID09ICJyaWdodCIpew0KICAgICAgICBwb3MyID0gImxlZnQiOw0KICAgICAgfQ0KICAgICAgDQogICAgICBsZWdlbmQuaWQgPSAibGVnZW5kIitlbC5pZDsNCiAgICAgIGxlZ2VuZC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Zsb2F0OicgKyBwb3MgKyAnOyB3aWR0aDonK2xlZ2VuZHdpZHRoKyclO2hlaWdodDoxMDAlJyk7DQogICAgICANCiAgICAgIC8vbGVnZW5kIHRpdGxlDQogICAgICBpZih4LmxlZ2VuZC5tYWluICE9PSB1bmRlZmluZWQpew0KICAgICAgICB2YXIgbGVnZW5kX3RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICAgIGxlZ2VuZF90aXRsZS5pbm5lckhUTUwgPSB4LmxlZ2VuZC5tYWluLnRleHQ7DQogICAgICAgIGxlZ2VuZF90aXRsZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgIHgubGVnZW5kLm1haW4uc3R5bGUpOw0KICAgICAgICBsZWdlbmQuYXBwZW5kQ2hpbGQobGVnZW5kX3RpdGxlKTsgIA0KICAgICAgICANCiAgICAgICAgbGVnZW5kLmlkID0gImxlZ2VuZF9tYWluIitlbC5pZDsNCiAgICAgICAgdmFyIGxlZ2VuZF9uZXR3b3JrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICAgIGxlZ2VuZF9uZXR3b3JrLmlkID0gImxlZ2VuZCIrZWwuaWQ7DQogICAgICAgIGxlZ2VuZF9uZXR3b3JrLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnaGVpZ2h0OjEwMCUnKTsNCiAgICAgICAgbGVnZW5kLmFwcGVuZENoaWxkKGxlZ2VuZF9uZXR3b3JrKTsgDQogICAgICB9DQogICAgICANCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluZGl2IitlbC5pZCkuYXBwZW5kQ2hpbGQobGVnZW5kKTsNCiAgICAgIGdyYXBoLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZmxvYXQ6JyArIHBvczIgKyAnOyB3aWR0aDonKygxMDAtbGVnZW5kd2lkdGgpKyclO2hlaWdodDoxMDAlJyk7DQogICAgfWVsc2V7DQogICAgICBncmFwaC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Zsb2F0OnJpZ2h0OyB3aWR0aDoxMDAlO2hlaWdodDoxMDAlJyk7DQogICAgfQ0KICAgIA0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluZGl2IitlbC5pZCkuYXBwZW5kQ2hpbGQoZ3JhcGgpOw0KICAgIA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vbGVnZW5kIGRlZmluaXRpb24NCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICBpZihhZGRsZWdlbmQpew0KICAgICAgDQogICAgICB2YXIgbGVnZW5kbm9kZXMgPSBuZXcgdmlzLkRhdGFTZXQoKTsNCiAgICAgIHZhciBsZWdlbmRlZGdlcyA9IG51bGw7DQogICAgICB2YXIgZGF0YWxlZ2VuZDsNCiAgICAgIHZhciB0bXBub2RlczsNCiAgICAgIA0KICAgICAgLy8gc2V0IHNvbWUgb3B0aW9ucw0KICAgICAgdmFyIG9wdGlvbnNsZWdlbmQgPSB7DQogICAgICAgIGludGVyYWN0aW9uOnsNCiAgICAgICAgICBkcmFnTm9kZXM6IGZhbHNlLA0KICAgICAgICAgIGRyYWdWaWV3OiBmYWxzZSwNCiAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSwNCiAgICAgICAgICB6b29tVmlldzogZmFsc2UNCiAgICAgICAgfSwNCiAgICAgICAgcGh5c2ljczp7DQogICAgICAgICAgc3RhYmlsaXphdGlvbjogZmFsc2UNCiAgICAgICAgfQ0KICAgICAgfTsNCiAgICAgIA0KICAgICAgZnVuY3Rpb24gcmFuZ2Uoc3RhcnQsIGxlbmd0aCwgc3RlcCwgcmVwKXsNCiAgICAgICAgdmFyIGE9W10sIGI9c3RhcnQ7DQogICAgICAgIHdoaWxlKGEubGVuZ3RoIDwgbGVuZ3RoKXsNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcDsgaSsrKXsNCiAgICAgICAgICAgIGEucHVzaChiKTsNCiAgICAgICAgICAgIGlmKGEubGVuZ3RoID09PSBsZW5ndGgpew0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgYis9c3RlcDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gYTsNCiAgICAgIH07DQogICAgICANCiAgICAgIHZhciBteW5ldHdvcmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGVnZW5kJytlbC5pZCk7DQogICAgICB2YXIgbHggPSBteW5ldHdvcmsuY2xpZW50V2lkdGggLyAyICsgNTA7DQogICAgICB2YXIgbHkgPSBteW5ldHdvcmsuY2xpZW50SGVpZ2h0IC8gMiArIDUwOw0KICAgICAgdmFyIGVkZ2VfbHkgPSBseTsNCiAgICAgIHZhciBuY29sID0geC5sZWdlbmQubmNvbDsNCiAgICAgIHZhciBzdGVwX3ggPSB4LmxlZ2VuZC5zdGVwWDsNCiAgICAgIHZhciBzdGVwX3kgPSB4LmxlZ2VuZC5zdGVwWTsNCiAgICAgIHZhciB0bXBfbHk7DQogICAgICB2YXIgdG1wX2x4ID0gbHg7DQogICAgICB2YXIgdG1wX2x4MjsNCiAgICAgIHZhciBhbGxfdG1wX3kgPSBbXTsNCiAgICAgIGlmKHRtcF9seCA9PT0gMCl7DQogICAgICAgIHRtcF9seCA9IDENCiAgICAgIH0NCiAgICAgIA0KICAgICAgLy8gY29uc3RydWN0IG5vZGVzIGRhdGEgaWYgbmVlZGVkDQogICAgICBpZih4LmxlZ2VuZC5ub2RlcyAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgaWYoeC5sZWdlbmQubm9kZXNUb0RhdGFmcmFtZSl7IC8vIGRhdGEgaW4gZGF0YS5mcmFtZQ0KICAgICAgICAgIHRtcG5vZGVzID0gdmlzTmV0d29ya2RhdGFmcmFtZVRvRDMoeC5sZWdlbmQubm9kZXMsICJub2RlcyIpDQogICAgICAgIH0gZWxzZSB7IC8vIGRhdGEgaW4gbGlzdA0KICAgICAgICAgIHRtcG5vZGVzID0geC5sZWdlbmQubm9kZXM7DQogICAgICAgIH0NCiAgICAgICAgLy8gb25seSBvbmUgZWxlbWVudCAgIA0KICAgICAgICBpZih0bXBub2Rlcy5sZW5ndGggPT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgdG1wbm9kZXMgPSBuZXcgQXJyYXkodG1wbm9kZXMpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICANCiAgICAgIC8vIGFycmF5IG9mIHkgcG9zaXRpb24gDQogICAgICBpZih4Lmdyb3VwcyAmJiB4LmxlZ2VuZC51c2VHcm91cHMgJiYgeC5sZWdlbmQubm9kZXMgIT09IHVuZGVmaW5lZCl7DQogICAgICAgIGFsbF90bXBfeSA9IHJhbmdlKGx5LCB4Lmdyb3Vwcy5sZW5ndGggKyB0bXBub2Rlcy5sZW5ndGgsIHN0ZXBfeSwgbmNvbCk7DQogICAgICB9IGVsc2UgaWYoeC5ncm91cHMgJiYgeC5sZWdlbmQudXNlR3JvdXBzICYmIHgubGVnZW5kLm5vZGVzID09PSB1bmRlZmluZWQpew0KICAgICAgICBhbGxfdG1wX3kgPSByYW5nZShseSwgeC5ncm91cHMubGVuZ3RoLCBzdGVwX3ksIG5jb2wpOw0KICAgICAgfSBlbHNlIGlmKHgubGVnZW5kLnVzZUdyb3VwcyA9PT0gZmFsc2UgJiYgeC5sZWdlbmQubm9kZXMgIT09IHVuZGVmaW5lZCl7DQogICAgICAgIGFsbF90bXBfeSA9IHJhbmdlKGx5LCB0bXBub2Rlcy5sZW5ndGgsIHN0ZXBfeSwgbmNvbCk7DQogICAgICB9DQogICAgICANCiAgICAgIC8vIHdhbnQgdG8gdmlldyBncm91cHMgaW4gbGVnZW5kDQogICAgICBpZih4Lmdyb3VwcyAmJiB4LmxlZ2VuZC51c2VHcm91cHMpew0KICAgICAgICAvLyBjcmVhdGUgZGF0YQ0KICAgICAgICBmb3IgKHZhciBnMSA9IDA7IGcxIDwgeC5ncm91cHMubGVuZ3RoOyBnMSsrKXsNCiAgICAgICAgICANCiAgICAgICAgICBpZihnMSA9PT0gMCl7DQogICAgICAgICAgICB0bXBfbHggPSBseDsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdG1wX2x4ID0gbHggKyBnMSVuY29sICogc3RlcF94Ow0KICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgICB0bXBfbHkgPSBhbGxfdG1wX3lbZzFdOw0KICAgICAgICAgIGlmKHRtcF9seSA9PT0gMCl7DQogICAgICAgICAgICB0bXBfbHkgPSAxDQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIGxlZ2VuZG5vZGVzLmFkZCh7aWQ6IG51bGwsIHggOiB0bXBfbHgsIHkgOiB0bXBfbHksIGxhYmVsOiB4Lmdyb3Vwc1tnMV0sIGdyb3VwOiB4Lmdyb3Vwc1tnMV0sIHZhbHVlOiAxLCBtYXNzOjB9KTsNCiAgICAgICAgICBlZGdlX2x5ID0gdG1wX2x5Ow0KICAgICAgICB9DQogICAgICAgIC8vIGNvbnRyb2wgaWNvbiBzaXplDQogICAgICAgIGlmKHgub3B0aW9ucy5ncm91cHMpew0KICAgICAgICAgIG9wdGlvbnNsZWdlbmQuZ3JvdXBzID0gY2xvbmUoeC5vcHRpb25zLmdyb3Vwcyk7DQogICAgICAgICAgZm9yICh2YXIgZ3JwIGluIG9wdGlvbnNsZWdlbmQuZ3JvdXBzKSB7DQogICAgICAgICAgICBpZihvcHRpb25zbGVnZW5kLmdyb3Vwc1tncnBdLnNoYXBlID09PSAiaWNvbiIpew0KICAgICAgICAgICAgICBvcHRpb25zbGVnZW5kLmdyb3Vwc1tncnBdLmljb24uc2l6ZSA9IDUwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgLy8gd2FudCB0byBhZGQgY3VzdG9tIG5vZGVzDQogICAgICBpZih4LmxlZ2VuZC5ub2RlcyAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgDQogICAgICAgIC8vIGNvbnRyb2wgaWNvbg0KICAgICAgICBmb3IgKHZhciBuZCBpbiB0bXBub2Rlcyl7DQogICAgICAgICAgaWYodG1wbm9kZXNbbmRdLmljb24gICYmICF4LmxlZ2VuZC5ub2Rlc1RvRGF0YWZyYW1lKXsNCiAgICAgICAgICAgIHRtcG5vZGVzW25kXS5pY29uLmNvZGUgPSBKU09OLnBhcnNlKCAnIicrJ1xcdScgKyB0bXBub2Rlc1tuZF0uaWNvbi5jb2RlICsgJyInKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgLy8gZ3JvdXAgY29udHJvbCBmb3IgeQ0KICAgICAgICB2YXIgYWRkX2dyX3kgPSAwOw0KICAgICAgICBpZih4Lmdyb3VwcyAmJiB4LmxlZ2VuZC51c2VHcm91cHMpew0KICAgICAgICAgIGFkZF9ncl95ID0geC5ncm91cHMubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIC8vIHNldCBjb29yZGluYXRlcw0KICAgICAgICBmb3IgKHZhciBnID0gMDsgZyA8IHRtcG5vZGVzLmxlbmd0aDsgZysrKXsNCiAgICAgICAgICBpZigoZytsZWdlbmRub2Rlcy5sZW5ndGgpID09PSAwKXsNCiAgICAgICAgICAgIHRtcF9seCA9IGx4Ow0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0bXBfbHggPSBseCArIChnK2xlZ2VuZG5vZGVzLmxlbmd0aCklbmNvbCAqIHN0ZXBfeDsNCiAgICAgICAgICB9DQogICAgICAgICAgDQogICAgICAgICAgdG1wX2x5ID0gYWxsX3RtcF95W2FkZF9ncl95ICsgZ107DQogICAgICAgICAgaWYodG1wX2x4ID09PSAwKXsNCiAgICAgICAgICAgIHRtcF9seCA9IDENCiAgICAgICAgICB9DQogICAgICAgICAgaWYodG1wX2x5ID09PSAwKXsNCiAgICAgICAgICAgIHRtcF9seSA9IDENCiAgICAgICAgICB9DQogICAgICAgICAgdG1wbm9kZXNbZ10ueCA9IHRtcF9seDsNCiAgICAgICAgICB0bXBub2Rlc1tnXS55ID0gdG1wX2x5Ow0KICAgICAgICAgIA0KICAgICAgICAgIGlmKHRtcG5vZGVzW2ddLnZhbHVlID09PSB1bmRlZmluZWQgJiYgdG1wbm9kZXNbZ10uc2l6ZSA9PT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgIHRtcG5vZGVzW2ddLnZhbHVlID0gMTsNCiAgICAgICAgICB9DQogICAgICAgICAgLyppZih0bXBub2Rlc1tnXS5pZCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgIHRtcG5vZGVzW2ddLmlkID0gbnVsbDsNCiAgICAgICAgICB9Ki8NCiAgICAgICAgICB0bXBub2Rlc1tnXS5tYXNzID0gMDsNCiAgICAgICAgICBlZGdlX2x5ID0gdG1wX2x5Ow0KICAgICAgICB9DQogICAgICAgIGxlZ2VuZG5vZGVzLmFkZCh0bXBub2Rlcyk7DQogICAgICB9DQogICAgICAvLyB3YW50IHRvIGFkZCBjdXN0b20gZWRnZXMNCiAgICAgIGlmKHgubGVnZW5kLmVkZ2VzICE9PSB1bmRlZmluZWQpew0KICAgICAgICBpZih4LmxlZ2VuZC5lZGdlc1RvRGF0YWZyYW1lKXsgLy8gZGF0YSBpbiBkYXRhLmZyYW1lDQogICAgICAgICAgbGVnZW5kZWRnZXMgPSB2aXNOZXR3b3JrZGF0YWZyYW1lVG9EMyh4LmxlZ2VuZC5lZGdlcywgImVkZ2VzIikNCiAgICAgICAgfSBlbHNlIHsgIC8vIGRhdGEgaW4gbGlzdA0KICAgICAgICAgIGxlZ2VuZGVkZ2VzID0geC5sZWdlbmQuZWRnZXM7DQogICAgICAgIH0NCiAgICAgICAgLy8gb25seSBvbmUgZWxlbWVudCANCiAgICAgICAgaWYobGVnZW5kZWRnZXMubGVuZ3RoID09PSB1bmRlZmluZWQpew0KICAgICAgICAgIGxlZ2VuZGVkZ2VzID0gbmV3IEFycmF5KGxlZ2VuZGVkZ2VzKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIHNldCBjb29yZGluYXRlcyBhbmQgb3B0aW9ucw0KICAgICAgICBmb3IgKHZhciBlZGcgPSAwOyBlZGcgPCAobGVnZW5kZWRnZXMubGVuZ3RoKTsgZWRnKyspew0KICAgICAgICAgIA0KICAgICAgICAgIHZhciB0bXBfaW50ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMSk7DQogICAgICAgICAgbGVnZW5kZWRnZXNbZWRnXS5mcm9tID0gZWRnICsgInRtcF9sZWdfZWRnZXNfIiArIHRtcF9pbnQgKyAiXzEiOw0KICAgICAgICAgIGxlZ2VuZGVkZ2VzW2VkZ10udG8gPSBlZGcgKyAidG1wX2xlZ19lZGdlc18iICsgdG1wX2ludCArICJfMiI7DQogICAgICAgICAgbGVnZW5kZWRnZXNbZWRnXS5waHlzaWNzID0gZmFsc2U7DQogICAgICAgICAgbGVnZW5kZWRnZXNbZWRnXS5zbW9vdGggPSBmYWxzZTsNCiAgICAgICAgICBsZWdlbmRlZGdlc1tlZGddLnZhbHVlID0gdW5kZWZpbmVkOw0KDQogICAgICAgICAgaWYobGVnZW5kZWRnZXNbZWRnXS5hcnJvd3MgPT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICBsZWdlbmRlZGdlc1tlZGddLmFycm93cyA9ICd0byc7DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIGlmKGxlZ2VuZGVkZ2VzW2VkZ10ud2lkdGggPT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICBsZWdlbmRlZGdlc1tlZGddLndpZHRoID0gMTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICB0bXBfbHkgPSBlZGdlX2x5ICsgKGVkZysxKSpzdGVwX3k7DQogICAgICAgICAgaWYodG1wX2x5ID09PSAwKXsNCiAgICAgICAgICAgIHRtcF9seSA9IDENCiAgICAgICAgICB9DQogICAgICAgICAgDQogICAgICAgICAgaWYobmNvbCA9PT0gMSl7DQogICAgICAgICAgICB0bXBfbHggPSBseCAtIG15bmV0d29yay5jbGllbnRXaWR0aC8zOw0KICAgICAgICAgICAgdG1wX2x4MiA9IGx4ICsgbXluZXR3b3JrLmNsaWVudFdpZHRoLzM7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRtcF9seCA9IGx4Ow0KICAgICAgICAgICAgdG1wX2x4MiA9IGx4ICsgKG5jb2wtMSkgKiBzdGVwX3g7DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIGlmKHRtcF9seCA9PT0gMCl7DQogICAgICAgICAgICB0bXBfbHggPSAxDQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIGlmKHRtcF9seDIgPT09IDApew0KICAgICAgICAgICAgdG1wX2x4MiA9IDENCiAgICAgICAgICB9DQogICAgICAgICAgDQogICAgICAgICAgbGVnZW5kbm9kZXMuYWRkKHtpZDogZWRnICsgInRtcF9sZWdfZWRnZXNfIiArIHRtcF9pbnQgKyAiXzEiLCB4IDogdG1wX2x4LCB5IDogdG1wX2x5LCBzaXplIDogMC4wMDAxLCBoaWRkZW4gOiBmYWxzZSwgc2hhcGUgOiAic3F1YXJlIiwgbWFzczowfSk7DQogICAgICAgICAgbGVnZW5kbm9kZXMuYWRkKHtpZDogZWRnICsgInRtcF9sZWdfZWRnZXNfIiArIHRtcF9pbnQgKyAiXzIiLCB4IDogdG1wX2x4MiwgeSA6IHRtcF9seSwgc2l6ZSA6IDAuMDAwMSwgaGlkZGVuIDogZmFsc2UsIHNoYXBlIDogInNxdWFyZSIsIG1hc3M6MH0pOw0KICAgICAgICB9DQogICAgICB9DQogICAgICANCiAgICAgIC8vIHJlbmRlciBsZWdlbmQgbmV0d29yaw0KICAgICAgZGF0YWxlZ2VuZCA9IHsNCiAgICAgICAgbm9kZXM6IGxlZ2VuZG5vZGVzLCANCiAgICAgICAgZWRnZXM6IGxlZ2VuZGVkZ2VzICAgICAgIA0KICAgICAgfTsNCg0KICAgICAgDQogICAgICBpbnN0YW5jZS5sZWdlbmQgPSBuZXcgdmlzLk5ldHdvcmsoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxlZ2VuZCIrZWwuaWQpLCBkYXRhbGVnZW5kLCBvcHRpb25zbGVnZW5kKTsNCiAgICAgIC8vbGluayBuZXR3b3JrIGZvciB1cGRhdGUgZm9yIHJlLXVzZSBhbmQgdXBkYXRlDQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGVnZW5kIitlbC5pZCkubmV0d29yayA9IGluc3RhbmNlLmxlZ2VuZDsNCiAgICB9DQogICAgDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgLy8gTWFpbiBOZXR3b3JrIHJlbmRlcmluZw0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIGlmKHgubm9kZXMpew0KICAgICAgDQogICAgICAvLyBuZXR3b3JrDQogICAgICBub2RlcyA9IG5ldyB2aXMuRGF0YVNldCgpOw0KICAgICAgZWRnZXMgPSBuZXcgdmlzLkRhdGFTZXQoKTsNCiAgICAgIA0KICAgICAgdmFyIHRtcG5vZGVzOw0KICAgICAgaWYoeC5ub2Rlc1RvRGF0YWZyYW1lKXsgLy8gZGF0YSBpbiBkYXRhLmZyYW1lDQogICAgICAgIHRtcG5vZGVzID0gdmlzTmV0d29ya2RhdGFmcmFtZVRvRDMoeC5ub2RlcywgIm5vZGVzIikNCiAgICAgIH0gZWxzZSB7IC8vIGRhdGEgaW4gbGlzdA0KICAgICAgICB0bXBub2RlcyA9IHgubm9kZXM7DQogICAgICB9DQogICAgICAvLyBvbmx5IG9uZSBlbGVtZW50ICAgDQogICAgICBpZih0bXBub2Rlcy5sZW5ndGggPT09IHVuZGVmaW5lZCl7DQogICAgICAgIHRtcG5vZGVzID0gbmV3IEFycmF5KHRtcG5vZGVzKTsNCiAgICAgIH0NCiAgICAgICAgDQogICAgICAvLyB1cGRhdGUgY29vcmRpbmF0ZXMgaWYgaWdyYXBoDQogICAgICBpZih4LmlncmFwaGxheW91dCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgLy8gdG8gaW1wcm92ZWQNCiAgICAgICAgdmFyIHpvb21MZXZlbCA9IC0yMzIuNjIyMzQ5IC8gKHRtcG5vZGVzLmxlbmd0aCArIDkxLjE2NTkxOSkgICsyLjUxNjg2MTsNCiAgICAgICAgdmFyIGlnY2xpZW50V2lkdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2VsLmlkKS5jbGllbnRXaWR0aDsNCiAgICAgICAgdmFyIHNjYWxleCA9IDEwMDsNCiAgICAgICAgdmFyIHNjYWxleSA9IDEwMDsNCiAgICAgICAgDQogICAgICAgIC8vIGN1cnJlbnQgZGl2IHZpc2libGVkDQogICAgICAgIGlmKGlnY2xpZW50V2lkdGggIT09IDApew0KICAgICAgICAgIHZhciBmYWN0b3IgPSBpZ2NsaWVudFdpZHRoIC8gMTg5MDsNCiAgICAgICAgICB6b29tTGV2ZWwgPSB6b29tTGV2ZWwvZmFjdG9yOw0KICAgICAgICAgIHZhciBzY2FsZXggPSAoaWdjbGllbnRXaWR0aCAvIDIpICogem9vbUxldmVsOw0KICAgICAgICAgIHZhciBzY2FsZXkgPSBzY2FsZXg7DQogICAgICAgICAgaWYoeC5pZ3JhcGhsYXlvdXQudHlwZSAhPT0gInNxdWFyZSIpew0KICAgICAgICAgICAgc2NhbGV5ID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZWwuaWQpLmNsaWVudEhlaWdodCAvIDIpICogem9vbUxldmVsOw0KICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAvLyBjdXJyZW50IGRpdiBub3QgdmlzaWJsZWQuLi4uDQogICAgICAgICAgaWdjbGllbnRXaWR0aCA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5zdHlsZS53aWR0aCk7DQogICAgICAgICAgaWYoaWdjbGllbnRXaWR0aCAhPT0gMCl7DQogICAgICAgICAgICB2YXIgZmFjdG9yID0gaWdjbGllbnRXaWR0aCAvIDE4OTA7DQogICAgICAgICAgICB6b29tTGV2ZWwgPSB6b29tTGV2ZWwvZmFjdG9yOw0KICAgICAgICAgICAgdmFyIHNjYWxleCA9IChpZ2NsaWVudFdpZHRoIC8gMikgKiB6b29tTGV2ZWw7DQogICAgICAgICAgICB2YXIgc2NhbGV5ID0gc2NhbGV4Ow0KICAgICAgICAgICAgaWYoeC5pZ3JhcGhsYXlvdXQudHlwZSAhPT0gInNxdWFyZSIpew0KICAgICAgICAgICAgICBzY2FsZXkgPSAocGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLnN0eWxlLmhlaWdodCkgLyAyKSAqIHpvb21MZXZlbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGZvciAodmFyIG5kIGluIHRtcG5vZGVzKSB7DQogICAgICAgICAgdG1wbm9kZXNbbmRdLnggPSB0bXBub2Rlc1tuZF0ueCAqIHNjYWxleDsNCiAgICAgICAgICB0bXBub2Rlc1tuZF0ueSA9IHRtcG5vZGVzW25kXS55ICogc2NhbGV5Ow0KICAgICAgICB9DQogICAgICB9DQogICAgICANCiAgICAgIG5vZGVzLmFkZCh0bXBub2Rlcyk7DQogICAgICANCiAgICAgIHZhciB0bXBlZGdlczsNCiAgICAgIGlmKHguZWRnZXNUb0RhdGFmcmFtZSl7IC8vIGRhdGEgaW4gZGF0YS5mcmFtZQ0KICAgICAgICB0bXBlZGdlcyA9IHZpc05ldHdvcmtkYXRhZnJhbWVUb0QzKHguZWRnZXMsICJlZGdlcyIpDQogICAgICB9IGVsc2UgeyAvLyBkYXRhIGluIGxpc3QNCiAgICAgICAgdG1wZWRnZXMgPSB4LmVkZ2VzOw0KICAgICAgfQ0KICAgICAgLy8gb25seSBvbmUgZWxlbWVudA0KICAgICAgaWYodG1wZWRnZXMgIT09IG51bGwpew0KICAgICAgICBpZih0bXBlZGdlcy5sZW5ndGggPT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgdG1wZWRnZXMgPSBuZXcgQXJyYXkodG1wZWRnZXMpOw0KICAgICAgICB9DQogICAgICAgIGVkZ2VzLmFkZCh0bXBlZGdlcyk7ICANCiAgICAgIH0NCiAgICAgIA0KICAgICAgLy8gcmVzZXQgdG1wbm9kZXMNCiAgICAgIHRtcG5vZGVzID0gbnVsbDsNCiAgICAgIA0KICAgICAgZGF0YSA9IHsNCiAgICAgICAgbm9kZXM6IG5vZGVzLA0KICAgICAgICBlZGdlczogZWRnZXMNCiAgICAgIH07DQogICAgICANCiAgICAgIC8vc2F2ZSBkYXRhIGZvciByZS11c2UgYW5kIHVwZGF0ZQ0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitlbC5pZCkubm9kZXMgPSBub2RlczsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZWwuaWQpLmVkZ2VzID0gZWRnZXM7DQoNCiAgICB9ZWxzZSBpZih4LmRvdCl7DQogICAgICBkYXRhID0gew0KICAgICAgICBkb3Q6IHguZG90DQogICAgICB9Ow0KICAgIH1lbHNlIGlmKHguZ2VwaGkpew0KICAgICAgZGF0YSA9IHsNCiAgICAgICAgZ2VwaGk6IHguZ2VwaGkNCiAgICAgIH07DQogICAgfSANCiAgICANCiAgICB2YXIgb3B0aW9ucyA9IHgub3B0aW9uczsNCg0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vbWFuaXB1bGF0aW9uDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgaWYoeC5vcHRpb25zLm1hbmlwdWxhdGlvbi5lbmFibGVkKXsNCg0KICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICAgIHN0eWxlLnR5cGUgPSAndGV4dC9jc3MnOw0KICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoeC5kYXRhY3NzKSk7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHN0eWxlKTsNCg0KICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgZGl2LmlkID0gJ25ldHdvcmstcG9wVXAnOw0KDQogICAgICBkaXYuaW5uZXJIVE1MID0gJzxzcGFuIGlkPSJvcGVyYXRpb24iPm5vZGU8L3NwYW4+IDxicj5cDQogICAgICA8dGFibGUgc3R5bGU9Im1hcmdpbjphdXRvOyI+PHRyPlwNCiAgICAgIDx0ZD5pZDwvdGQ+PHRkPjxpbnB1dCBpZD0ibm9kZS1pZCIgdmFsdWU9Im5ldyB2YWx1ZSIgZGlzYWJsZWQgPSB0cnVlPjwvdGQ+XA0KICAgICAgPC90cj5cDQogICAgICA8dHI+XA0KICAgICAgPHRkPmxhYmVsPC90ZD48dGQ+PGlucHV0IGlkPSJub2RlLWxhYmVsIiB2YWx1ZT0ibmV3IHZhbHVlIj4gPC90ZD5cDQogICAgICA8L3RyPjwvdGFibGU+XA0KICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9InNhdmUiIGlkPSJzYXZlQnV0dG9uIj48L2J1dHRvbj5cDQogICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iY2FuY2VsIiBpZD0iY2FuY2VsQnV0dG9uIj48L2J1dHRvbj4nOw0KDQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYXBwZW5kQ2hpbGQoZGl2KTsNCg0KICAgICAgb3B0aW9ucy5tYW5pcHVsYXRpb24uYWRkTm9kZSA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVyYXRpb24nKS5pbm5lckhUTUwgPSAiQWRkIE5vZGUiOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm9kZS1pZCcpLnZhbHVlID0gZGF0YS5pZDsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vZGUtbGFiZWwnKS52YWx1ZSA9IGRhdGEubGFiZWw7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlQnV0dG9uJykub25jbGljayA9IHNhdmVOb2RlLmJpbmQodGhpcywgZGF0YSwgY2FsbGJhY2ssICJhZGROb2RlIik7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW5jZWxCdXR0b24nKS5vbmNsaWNrID0gY2xlYXJQb3BVcC5iaW5kKCk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXR3b3JrLXBvcFVwJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICB9Ow0KDQogICAgICBvcHRpb25zLm1hbmlwdWxhdGlvbi5lZGl0Tm9kZSA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVyYXRpb24nKS5pbm5lckhUTUwgPSAiRWRpdCBOb2RlIjsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vZGUtaWQnKS52YWx1ZSA9IGRhdGEuaWQ7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub2RlLWxhYmVsJykudmFsdWUgPSBkYXRhLmxhYmVsOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZUJ1dHRvbicpLm9uY2xpY2sgPSBzYXZlTm9kZS5iaW5kKHRoaXMsIGRhdGEsIGNhbGxiYWNrLCAiZWRpdE5vZGUiKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbEJ1dHRvbicpLm9uY2xpY2sgPSBjYW5jZWxFZGl0LmJpbmQodGhpcyxjYWxsYmFjayk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXR3b3JrLXBvcFVwJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICB9Ow0KDQogICAgICBvcHRpb25zLm1hbmlwdWxhdGlvbi5kZWxldGVOb2RlID0gZnVuY3Rpb24oZGF0YSwgY2FsbGJhY2spIHsNCiAgICAgICAgICB2YXIgciA9IGNvbmZpcm0oIkRvIHlvdSB3YW50IHRvIGRlbGV0ZSAiICsgZGF0YS5ub2Rlcy5sZW5ndGggKyAiIG5vZGUocykgYW5kICIgKyBkYXRhLmVkZ2VzLmxlbmd0aCArICIgZWRnZXMgPyIpOw0KICAgICAgICAgIGlmIChyID09PSB0cnVlKSB7DQogICAgICAgICAgICBkZWxldGVTdWJHcmFwaChkYXRhLCBjYWxsYmFjayk7DQogICAgICAgICAgfQ0KICAgICAgfTsNCg0KICAgICAgb3B0aW9ucy5tYW5pcHVsYXRpb24uZGVsZXRlRWRnZSA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7DQogICAgICAgICAgdmFyIHIgPSBjb25maXJtKCJEbyB5b3Ugd2FudCB0byBkZWxldGUgIiArIGRhdGEuZWRnZXMubGVuZ3RoICsgIiBlZGdlcyA/Iik7DQogICAgICAgICAgaWYgKHIgPT09IHRydWUpIHsNCiAgICAgICAgICAgIGRlbGV0ZVN1YkdyYXBoKGRhdGEsIGNhbGxiYWNrKTsNCiAgICAgICAgICB9DQogICAgICB9Ow0KDQogICAgICBvcHRpb25zLm1hbmlwdWxhdGlvbi5hZGRFZGdlID0gZnVuY3Rpb24oZGF0YSwgY2FsbGJhY2spIHsNCiAgICAgICAgaWYgKGRhdGEuZnJvbSA9PSBkYXRhLnRvKSB7DQogICAgICAgICAgdmFyIHIgPSBjb25maXJtKCJEbyB5b3Ugd2FudCB0byBjb25uZWN0IHRoZSBub2RlIHRvIGl0c2VsZj8iKTsNCiAgICAgICAgICBpZiAociA9PT0gdHJ1ZSkgew0KICAgICAgICAgICAgc2F2ZUVkZ2UoZGF0YSwgY2FsbGJhY2ssICJhZGRFZGdlIik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgIHNhdmVFZGdlKGRhdGEsIGNhbGxiYWNrLCAiYWRkRWRnZSIpOw0KICAgICAgICB9DQogICAgICB9Ow0KICAgICAgDQogICAgICBvcHRpb25zLm1hbmlwdWxhdGlvbi5lZGl0RWRnZSA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7DQogICAgICAgIGlmIChkYXRhLmZyb20gPT0gZGF0YS50bykgew0KICAgICAgICAgIHZhciByID0gY29uZmlybSgiRG8geW91IHdhbnQgdG8gY29ubmVjdCB0aGUgbm9kZSB0byBpdHNlbGY/Iik7DQogICAgICAgICAgaWYgKHIgPT09IHRydWUpIHsNCiAgICAgICAgICAgIHNhdmVFZGdlKGRhdGEsIGNhbGxiYWNrLCAiZWRpdEVkZ2UiKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgc2F2ZUVkZ2UoZGF0YSwgY2FsbGJhY2ssICJlZGl0RWRnZSIpOw0KICAgICAgICB9DQogICAgICB9Ow0KICAgIH0NCiAgICANCiAgICAvLyBjcmVhdGUgbmV0d29yaw0KICAgIGluc3RhbmNlLm5ldHdvcmsgPSBuZXcgdmlzLk5ldHdvcmsoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitlbC5pZCksIGRhdGEsIG9wdGlvbnMpOw0KICAgIA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vYWRkIHZhbHVlcyB0byBpZHNlbGVjdGlvbg0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIA0KICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5pZHNlbGVjdGlvbil7ICANCiAgICAgIHZhciBzZWxlY3RMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5vZGVTZWxlY3QiK2VsLmlkKQ0KICAgICAgc2V0Tm9kZUlkTGlzdChzZWxlY3RMaXN0LCB4Lmlkc2VsZWN0aW9uLCBub2RlcykNCiAgICAgIA0KICAgICAgaWYgKHdpbmRvdy5TaGlueSl7DQogICAgICAgIGNoYW5nZUlucHV0KCdzZWxlY3RlZCcsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub2RlU2VsZWN0IitlbC5pZCkudmFsdWUpOw0KICAgICAgfQ0KICAgIH0NCiAgICAgIA0KICAgIC8vc2F2ZSBkYXRhIGZvciByZS11c2UgYW5kIHVwZGF0ZQ0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZWwuaWQpLmNoYXJ0ID0gaW5zdGFuY2UubmV0d29yazsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2VsLmlkKS5vcHRpb25zID0gb3B0aW9uczsNCiAgICANCiAgICAvLy8vLy8vLy8NCiAgICAvLyBwb3B1cA0KICAgIC8vLy8vLy8vLw0KICAgIA0KICAgIC8vIFRlbXBvcmFyeSB2YXJpYWJsZXMgdG8gaG9sZCBtb3VzZSB4LXkgcG9zLnMNCiAgICB2YXIgdGVtcFggPSAwDQogICAgdmFyIHRlbXBZID0gMA0KDQogICAgLy8gTWFpbiBmdW5jdGlvbiB0byByZXRyaWV2ZSBtb3VzZSB4LXkgcG9zLnMNCiAgICBmdW5jdGlvbiBnZXRNb3VzZVhZKGUpIHsNCiAgICAgIHRlbXBYID0gZS5jbGllbnRYDQogICAgICB0ZW1wWSA9IGUuY2xpZW50WQ0KICAgICAgLy8gY2F0Y2ggcG9zc2libGUgbmVnYXRpdmUgdmFsdWVzIGluIE5TDQogICAgICBpZiAodGVtcFggPCAwKXt0ZW1wWCA9IDB9DQogICAgICBpZiAodGVtcFkgPCAwKXt0ZW1wWSA9IDB9DQogICAgfQ0KDQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZ2V0TW91c2VYWSk7DQoNCiAgIC8vdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgic2hvd1BvcHVwIix7aWQ6dGhpcy5wb3B1cE9iai5pZCx4OnQueCszLHk6dC55LTV9KSkNCg0KICAgIC8vIHBvcHVwIGZvciB0aXRsZQ0KICAgIHZhciBwb3B1cFN0YXRlID0gZmFsc2U7DQogICAgdmFyIHBvcHVwVGltZW91dCA9IG51bGw7DQogICAgdmFyIHZpc3BvcHVwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgdmFyIHBvcHVwU3R5bGUgPSAncG9zaXRpb246IGZpeGVkO3Zpc2liaWxpdHk6aGlkZGVuO3BhZGRpbmc6IDVweDt3aGl0ZS1zcGFjZTogbm93cmFwO2ZvbnQtZmFtaWx5OiB2ZXJkYW5hO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtY29sb3I6IzAwMDAwMDtiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNGVkOy1tb3otYm9yZGVyLXJhZGl1czogM3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4O2JvcmRlci1yYWRpdXM6IDNweDtib3JkZXI6IDFweCBzb2xpZCAjODA4MDc0O2JveC1zaGFkb3c6IDNweCAzcHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMiknDQogICAgaWYoeC50b29sdGlwU3R5bGUgIT09IHVuZGVmaW5lZCl7DQogICAgICBwb3B1cFN0eWxlID0geC50b29sdGlwU3R5bGUNCiAgICB9DQogICAgdmFyIHBvcHVwU3RheSA9IDMwMDsNCiAgICBpZih4LnRvb2x0aXBTdGF5ICE9PSB1bmRlZmluZWQpew0KICAgICAgcG9wdXBTdGF5ID0geC50b29sdGlwU3RheQ0KICAgIH0NCiAgICB2aXNwb3B1cC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgcG9wdXBTdHlsZSkNCiAgICANCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2VsLmlkKS5hcHBlbmRDaGlsZCh2aXNwb3B1cCk7DQogICAgDQogICAgLy8gYWRkIHNvbWUgZXZlbnQgbGlzdGVuZXJzIHRvIGF2b2lkIGl0IGRpc2FwcGVhcmluZyB3aGVuIHRoZSBtb3VzZSBpZiBvdmVyIGl0Lg0KICAgIHZpc3BvcHVwLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsZnVuY3Rpb24gKCkgew0KICAgICAgaWYgKHBvcHVwVGltZW91dCAhPT0gbnVsbCkgew0KICAgICAgICBjbGVhclRpbWVvdXQocG9wdXBUaW1lb3V0KTsNCiAgICAgICAgcG9wdXBUaW1lb3V0ID0gbnVsbDsNCiAgICAgIH0NCiAgICB9KTsNCiAgDQogICAgLy8gc2V0IHRoZSB0aW1lb3V0IHdoZW4gdGhlIG1vdXNlIGxlYXZlcyBpdC4NCiAgICB2aXNwb3B1cC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsZnVuY3Rpb24gKCkgew0KICAgICAgaWYgKHBvcHVwVGltZW91dCA9PT0gbnVsbCkgew0KICAgICAgICBteUhpZGVQb3B1cCgxMDApOw0KICAgICAgfQ0KICAgIH0pOw0KICAgIA0KICAgIC8vIHVzZSB0aGUgcG9wdXAgZXZlbnQgdG8gc2hvdw0KICAgIGluc3RhbmNlLm5ldHdvcmsub24oInNob3dQb3B1cCIsIGZ1bmN0aW9uKHBhcmFtcykgew0KICAgICAgcG9wdXBTdGF0ZSA9IHRydWU7ICANCiAgICAgIG15U2hvd1BvcHVwKHBhcmFtcyk7DQogICAgfSkNCiAgDQogICAgLy8gdXNlIHRoZSBoaWRlIGV2ZW50IHRvIGhpZGUgaXQNCiAgICBpbnN0YW5jZS5uZXR3b3JrLm9uKCJoaWRlUG9wdXAiLCBmdW5jdGlvbihwYXJhbXMpIHsNCiAgICAgIC8vIGF2b2lkIGRvdWJsZSBmaXJpbmcgb2YgdGhpcyBldmVudCwgYnVnIGluIDQuMi4wDQogICAgICBpZiAocG9wdXBTdGF0ZSA9PT0gdHJ1ZSkgew0KICAgICAgICBwb3B1cFN0YXRlID0gZmFsc2U7DQogICAgICAgIG15SGlkZVBvcHVwKHBvcHVwU3RheSk7DQogICAgICB9DQogICAgfSkNCiAgDQogICAgLy8gaGlkaW5nIHRoZSBwb3B1cCB0aHJvdWdoIGNzcyBhbmQgYSB0aW1lb3V0DQogICAgZnVuY3Rpb24gbXlIaWRlUG9wdXAoZGVsYXkpIHsNCiAgICAgIHBvcHVwVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7dmlzcG9wdXAuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO30sIGRlbGF5KTsNCiAgICB9DQogIA0KICAgIC8vIHNob3dpbmcgdGhlIHBvcHVwDQogICAgZnVuY3Rpb24gbXlTaG93UG9wdXAoaWQpIHsNCiAgICAgIC8vIGdldCB0aGUgZGF0YSBmcm9tIHRoZSB2aXMuRGF0YVNldA0KICAgICAgdmFyIG5vZGVEYXRhID0gbm9kZXMuZ2V0KFtpZF0pOw0KICAgICAgdmFyIGVkZ2VEYXRhID0gZWRnZXMuZ2V0KFtpZF0pOw0KICAgICAgDQogICAgICAvLyBhIG5vZGUgPw0KICAgICAgaWYobm9kZURhdGFbMF0gIT09IG51bGwgJiYgbm9kZURhdGFbMF0gIT09IHVuZGVmaW5lZCl7DQogICAgICAgIHZpc3BvcHVwLmlubmVySFRNTCA9IG5vZGVEYXRhWzBdLnRpdGxlOw0KICAgICAgICAvLyBzaG93IGFuZCBwbGFjZSB0aGUgdG9vbHRpcC4NCiAgICAgICAgdmlzcG9wdXAuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsNCiAgICAgICAgdmlzcG9wdXAuc3R5bGUudG9wID0gdGVtcFkgLSAyMCArICAicHgiOw0KICAgICAgICB2aXNwb3B1cC5zdHlsZS5sZWZ0ID0gdGVtcFggKyA1ICsgInB4IjsNCiAgICAgICAgDQogICAgICB9IGVsc2UgaWYoZWRnZURhdGFbMF0gIT09IG51bGwgJiYgZWRnZURhdGFbMF0gIT09IHVuZGVmaW5lZCl7DQogICAgICAgIC8vIHNvIGl0J3MgcGVyaGFwcyBhIGVkZ2UgPw0KICAgICAgICB2aXNwb3B1cC5pbm5lckhUTUwgPSBlZGdlRGF0YVswXS50aXRsZTsNCiAgICAgICAgLy8gc2hvdyBhbmQgcGxhY2UgdGhlIHRvb2x0aXAuDQogICAgICAgIHZpc3BvcHVwLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7DQogICAgICAgIHZpc3BvcHVwLnN0eWxlLnRvcCA9IHRlbXBZIC0gMjAgKyAgInB4IjsNCiAgICAgICAgdmlzcG9wdXAuc3R5bGUubGVmdCA9IHRlbXBYICsgNSArICJweCI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICAvLyBvciBhIGNsdXN0ZXIgPw0KICAgICAgICB2YXIgbm9kZV9jbHVzdGVyID0gaW5zdGFuY2UubmV0d29yay5ib2R5Lm5vZGVzW2lkXQ0KICAgICAgICBpZihub2RlX2NsdXN0ZXIgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgdmlzcG9wdXAuaW5uZXJIVE1MID0gbm9kZV9jbHVzdGVyLm9wdGlvbnMudGl0bGU7DQogICAgICAgICAgLy8gc2hvdyBhbmQgcGxhY2UgdGhlIHRvb2x0aXAuDQogICAgICAgICAgdmlzcG9wdXAuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsNCiAgICAgICAgICB2aXNwb3B1cC5zdHlsZS50b3AgPSB0ZW1wWSAtIDIwICsgICJweCI7DQogICAgICAgICAgdmlzcG9wdXAuc3R5bGUubGVmdCA9IHRlbXBYICsgNSArICJweCI7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIA0KICAgICAgLy8gZm9yIHNwYXJrbGluZS4gRXZhbCBzY3JpcHQuLi4NCiAgICAgIHZhciBhbnlfc2NyaXB0PSB2aXNwb3B1cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JykNCiAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgYW55X3NjcmlwdC5sZW5ndGg7IG4rKyl7DQogICAgICAgIGlmKGFueV9zY3JpcHRbbl0uZ2V0QXR0cmlidXRlKCJ0eXBlIikgPT09ICJ0ZXh0L2phdmFzY3JpcHQiKXsNCiAgICAgICAgICAgZXZhbChhbnlfc2NyaXB0W25dLmlubmVySFRNTCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vIEV2ZW50cw0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIGlmKHguZXZlbnRzICE9PSB1bmRlZmluZWQpew0KICAgICAgZm9yICh2YXIga2V5IGluIHguZXZlbnRzKSB7DQogICAgICAgICAgaW5zdGFuY2UubmV0d29yay5vbihrZXksIHguZXZlbnRzW2tleV0pOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGlmKHguT25jZUV2ZW50cyAhPT0gdW5kZWZpbmVkKXsNCiAgICAgIGZvciAodmFyIGtleSBpbiB4Lk9uY2VFdmVudHMpIHsNCiAgICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLm9uY2Uoa2V5LCB4Lk9uY2VFdmVudHNba2V5XSk7DQogICAgICB9DQogICAgfQ0KICAgIA0KICAgIGlmKHguUmVzZXRFdmVudHMgIT09IHVuZGVmaW5lZCl7DQogICAgICBmb3IgKHZhciBrZXkgaW4geC5SZXNldEV2ZW50cykgew0KICAgICAgICAgIGluc3RhbmNlLm5ldHdvcmsub2ZmKGtleSk7DQogICAgICB9DQogICAgfQ0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vIFNlbGVjdGVkIEhpZ2hsaWdodA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQogICAgZnVuY3Rpb24gc2VsZWN0ZWRIaWdobGlnaHQodmFsdWUpIHsNCiAgICAgIC8vIGdldCBjdXJyZW50IG5vZGVzDQogICAgICB2YXIgYWxsTm9kZXMgPSBub2Rlcy5nZXQoe3JldHVyblR5cGU6Ik9iamVjdCJ9KTsNCiAgICAgICANCiAgICAgIC8vIGZpcnN0IHJlc2V0RWRnZXMNCiAgICAgIHJlc2V0QWxsRWRnZXMoZWRnZXMsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ieXNlbGVjdGlvbkNvbG9yLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0Q29sb3IsIGluc3RhbmNlLm5ldHdvcmspOw0KICAgICAgdmFyIGNvbm5lY3RlZE5vZGVzID0gW107ICANCiAgICAgIA0KICAgICAgLy8gZ2V0IHZhcmlhYmxlDQogICAgICB2YXIgc2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uX3ZhcmlhYmxlOw0KICAgICAgLy8gbmVlZCB0byBtYWtlIGFuIHVwZGF0ZT8NCiAgICAgIHZhciB1cGRhdGUgPSAhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5zZWxlY3RBY3RpdmUgPT09IGZhbHNlICYmIHZhbHVlID09PSAiIik7DQoNCiAgICAgIGlmICh2YWx1ZSAhPT0gIiIpIHsNCiAgICAgICAgdmFyIHVwZGF0ZUFycmF5ID0gW107DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5zZWxlY3RBY3RpdmUgPSB0cnVlOw0KICAgICAgICANCiAgICAgICAgLy8gbWFyayBhbGwgbm9kZXMgYXMgaGFyZCB0byByZWFkLg0KICAgICAgICBmb3IgKHZhciBub2RlSWQgaW4gYWxsTm9kZXMpIHsNCiAgICAgICAgICB2YXIgdmFsdWVfaW4gPSBmYWxzZTsNCiAgICAgICAgICAvLyB1bmlxdWUgc2VsZWN0aW9uDQogICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uX211bHRpcGxlID09PSBmYWxzZSl7DQogICAgICAgICAgICBpZihzZWwgPT0gImxhYmVsIil7DQogICAgICAgICAgICAgIHZhbHVlX2luID0gKChhbGxOb2Rlc1tub2RlSWRdWyJsYWJlbCJdICsgIiIpID09PSB2YWx1ZSkgfHwgKChhbGxOb2Rlc1tub2RlSWRdWyJoaWRkZW5MYWJlbCJdICsgIiIpID09PSB2YWx1ZSk7DQogICAgICAgICAgICB9ZWxzZSBpZihzZWwgPT0gImNvbG9yIil7DQogICAgICAgICAgICAgIHZhbHVlX2luID0gKChhbGxOb2Rlc1tub2RlSWRdWyJjb2xvciJdICsgIiIpID09PSB2YWx1ZSkgfHwgKChhbGxOb2Rlc1tub2RlSWRdWyJoaWRkZW5Db2xvciJdICsgIiIpID09PSB2YWx1ZSk7DQogICAgICAgICAgICB9ZWxzZSB7DQogICAgICAgICAgICAgIHZhbHVlX2luID0gKGFsbE5vZGVzW25vZGVJZF1bc2VsXSArICIiKSA9PT0gdmFsdWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgfWVsc2V7IC8vIG11bHRpcGxlIHNlbGVjdGlvbg0KICAgICAgICAgICAgaWYoc2VsID09ICJsYWJlbCIpew0KICAgICAgICAgICAgICB2YXIgY3VycmVudF92YWx1ZSA9IGFsbE5vZGVzW25vZGVJZF1bImxhYmVsIl0gKyAiIjsNCiAgICAgICAgICAgICAgdmFyIHZhbHVlX3NwbGl0ID0gY3VycmVudF92YWx1ZS5zcGxpdCgiLCIpLm1hcChGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgU3RyaW5nLnByb3RvdHlwZS50cmltKTsNCiAgICAgICAgICAgICAgdmFyIGN1cnJlbnRfdmFsdWUyID0gYWxsTm9kZXNbbm9kZUlkXVsiaGlkZGVuTGFiZWwiXSArICIiOw0KICAgICAgICAgICAgICB2YXIgdmFsdWVfc3BsaXQyID0gY3VycmVudF92YWx1ZS5zcGxpdCgiLCIpLm1hcChGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgU3RyaW5nLnByb3RvdHlwZS50cmltKTsNCiAgICAgICAgICAgICAgdmFsdWVfaW4gPSAodmFsdWVfc3BsaXQuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB8fCAodmFsdWVfc3BsaXQyLmluZGV4T2YodmFsdWUpICE9PSAtMSk7DQogICAgICAgICAgICB9ZWxzZSBpZihzZWwgPT0gImNvbG9yIil7DQogICAgICAgICAgICAgIHZhciBjdXJyZW50X3ZhbHVlID0gYWxsTm9kZXNbbm9kZUlkXVsiY29sb3IiXSArICIiOw0KICAgICAgICAgICAgICB2YXIgdmFsdWVfc3BsaXQgPSBjdXJyZW50X3ZhbHVlLnNwbGl0KCIsIikubWFwKEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnRyaW0pOw0KICAgICAgICAgICAgICB2YXIgY3VycmVudF92YWx1ZTIgPSBhbGxOb2Rlc1tub2RlSWRdWyJoaWRkZW5Db2xvciJdICsgIiI7DQogICAgICAgICAgICAgIHZhciB2YWx1ZV9zcGxpdDIgPSBjdXJyZW50X3ZhbHVlLnNwbGl0KCIsIikubWFwKEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnRyaW0pOw0KICAgICAgICAgICAgICB2YWx1ZV9pbiA9ICh2YWx1ZV9zcGxpdC5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHx8ICh2YWx1ZV9zcGxpdDIuaW5kZXhPZih2YWx1ZSkgIT09IC0xKTsNCiAgICAgICAgICAgIH1lbHNlIHsNCiAgICAgICAgICAgICAgdmFyIGN1cnJlbnRfdmFsdWUgPSBhbGxOb2Rlc1tub2RlSWRdW3NlbF0gKyAiIjsNCiAgICAgICAgICAgICAgdmFyIHZhbHVlX3NwbGl0ID0gY3VycmVudF92YWx1ZS5zcGxpdCgiLCIpLm1hcChGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgU3RyaW5nLnByb3RvdHlwZS50cmltKTsNCiAgICAgICAgICAgICAgdmFsdWVfaW4gPSB2YWx1ZV9zcGxpdC5pbmRleE9mKHZhbHVlKSAhPT0gLTE7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmKHZhbHVlX2luID09PSBmYWxzZSl7IC8vIG5vdCBpbiBzZWxlY3Rpb24sIHNvIGFzIGhhcmQgdG8gcmVhZA0KICAgICAgICAgICAgbm9kZUFzSGFyZFRvUmVhZChhbGxOb2Rlc1tub2RlSWRdLCBpbnN0YW5jZS5uZXR3b3JrLmdyb3Vwcywgb3B0aW9ucywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uQ29sb3IsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRDb2xvciwgaW5zdGFuY2UubmV0d29yaywgIm5vZGUiKTsNCiAgICAgICAgICB9IGVsc2UgeyAvLyBpbiBzZWxlY3Rpb24sIHNvIHJlc2V0IGlmIG5lZWRlZA0KICAgICAgICAgICAgY29ubmVjdGVkTm9kZXMgPSBjb25uZWN0ZWROb2Rlcy5jb25jYXQoYWxsTm9kZXNbbm9kZUlkXS5pZCk7DQogICAgICAgICAgICByZXNldE9uZU5vZGUoYWxsTm9kZXNbbm9kZUlkXSwgaW5zdGFuY2UubmV0d29yay5ncm91cHMsIG9wdGlvbnMsIGluc3RhbmNlLm5ldHdvcmspOw0KICAgICAgICAgIH0NCiAgICAgICAgICBhbGxOb2Rlc1tub2RlSWRdLnggPSB1bmRlZmluZWQ7DQogICAgICAgICAgYWxsTm9kZXNbbm9kZUlkXS55ID0gdW5kZWZpbmVkOw0KICAgICAgICAgIC8vIHVwZGF0ZSBkYXRhDQogICAgICAgICAgaWYgKGFsbE5vZGVzLmhhc093blByb3BlcnR5KG5vZGVJZCkgJiYgdXBkYXRlKSB7DQogICAgICAgICAgICB1cGRhdGVBcnJheS5wdXNoKGFsbE5vZGVzW25vZGVJZF0pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZih1cGRhdGUpew0KICAgICAgICAgIC8vIHNldCBzb21lIGVkZ2VzIGFzIGhhcmQgdG8gcmVhZA0KICAgICAgICAgIHZhciBlZGdlc0hhcmRUb1JlYWQgPSBlZGdlcy5nZXQoew0KICAgICAgICAgICAgZmllbGRzOiBbJ2lkJywgJ2NvbG9yJywgJ2hpZGRlbkNvbG9yJywgJ2hpZGRlbkxhYmVsJywgJ2xhYmVsJ10sDQogICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChpdGVtKSB7DQogICAgICAgICAgICAgIHJldHVybiAoaW5kZXhPZi5jYWxsKGNvbm5lY3RlZE5vZGVzLCBpdGVtLmZyb20sIHRydWUpID09PSAtMSkgOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJldHVyblR5cGUgOidBcnJheScNCiAgICAgICAgICB9KTsNCg0KICAgICAgICAgIC8vIGFsbCBpbiBkZWdyZWUgbm9kZXMgZ2V0IHRoZWlyIG93biBjb2xvciBhbmQgdGhlaXIgbGFiZWwgYmFjaw0KICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlZGdlc0hhcmRUb1JlYWQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGVkZ2VBc0hhcmRUb1JlYWQoZWRnZXNIYXJkVG9SZWFkW2ldLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb25Db2xvciwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodENvbG9yLCBpbnN0YW5jZS5uZXR3b3JrLCB0eXBlID0gImVkZ2UiKQ0KICAgICAgICAgIH0NCiAgICAgICAgICBlZGdlcy51cGRhdGUoZWRnZXNIYXJkVG9SZWFkKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgIG5vZGVzLnVwZGF0ZSh1cGRhdGVBcnJheSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGVsc2UgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5zZWxlY3RBY3RpdmUgPT09IHRydWUpIHsNCiAgICAgICAgLy9yZXNldCBub2Rlcw0KICAgICAgICByZXNldEFsbE5vZGVzKG5vZGVzLCB1cGRhdGUsIGluc3RhbmNlLm5ldHdvcmsuZ3JvdXBzLCBvcHRpb25zLCBpbnN0YW5jZS5uZXR3b3JrKQ0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuc2VsZWN0QWN0aXZlID0gZmFsc2UNCiAgICAgIH0NCiAgICB9IA0KICANCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAvL0hpZ2hsaWdodA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIHZhciBpc19ob3ZlcmVkID0gZmFsc2U7DQogICAgdmFyIGlzX2NsaWNrZWQgPSBmYWxzZTsNCiAgICANCiAgICBmdW5jdGlvbiBuZWlnaGJvdXJob29kSGlnaGxpZ2h0KHBhcmFtcywgYWN0aW9uX3R5cGUsIGFsZ29yaXRobSkgew0KDQogICAgICB2YXIgbm9kZXNfaW5fY2x1c3RlcnMgPSBpbnN0YW5jZS5uZXR3b3JrLmJvZHkubW9kdWxlcy5jbHVzdGVyaW5nLmNsdXN0ZXJlZE5vZGVzOw0KICAgICAgdmFyIGhhdmVfY2x1c3Rlcl9ub2RlcyA9IGZhbHNlOw0KICAgICAgaWYoT2JqZWN0LmtleXMobm9kZXNfaW5fY2x1c3RlcnMpLmxlbmd0aCA+IDApew0KICAgICAgICBoYXZlX2NsdXN0ZXJfbm9kZXMgPSB0cnVlOw0KICAgICAgICBub2Rlc19pbl9jbHVzdGVycyA9IE9iamVjdC5rZXlzKG5vZGVzX2luX2NsdXN0ZXJzKTsNCiAgICAgICAgZWRnZXNfaW5fY2x1c3RlcnMgPSBPYmplY3Qua2V5cyhpbnN0YW5jZS5uZXR3b3JrLmJvZHkubW9kdWxlcy5jbHVzdGVyaW5nLmNsdXN0ZXJlZEVkZ2VzKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIG5vZGVzX2luX2NsdXN0ZXJzID0gW107DQogICAgICAgIGVkZ2VzX2luX2NsdXN0ZXJzID0gW107DQogICAgICB9DQogICAgICANCiAgICAgIHZhciBzZWxlY3ROb2RlOw0KICAgICAgLy8gZ2V0IG5vZGVzIGRhdGENCiAgICAgIHZhciBhbGxOb2RlcyA9IG5vZGVzLmdldCh7cmV0dXJuVHlwZToiT2JqZWN0In0pOw0KDQogICAgICAvLyBjbHVzdGVyDQogICAgICB2YXIgYXJyYXlfY2x1c3Rlcl9pZDsNCiAgICAgIA0KICAgICAgLy8gdXBkYXRlIA0KICAgICAgdmFyIHVwZGF0ZSA9ICEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodEFjdGl2ZSA9PT0gZmFsc2UgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMCkgfCAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLnNlbGVjdEFjdGl2ZSA9PT0gdHJ1ZSAmJiBwYXJhbXMubGVuZ3RoID09PSAwKTsNCg0KICAgICAgaWYoIShhY3Rpb25fdHlwZSA9PSAiaG92ZXIiICYmIGlzX2NsaWNrZWQpKXsNCiAgICAgICAgDQogICAgICAgIC8vIGZpcnN0IHJlc2V0RWRnZXMNCiAgICAgICAgcmVzZXRBbGxFZGdlcyhlZGdlcywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodENvbG9yLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb25Db2xvciwgaW5zdGFuY2UubmV0d29yayk7DQoNCiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgdmFyIGlzX2NsdXN0ZXIgPSBpbnN0YW5jZS5uZXR3b3JrLmlzQ2x1c3RlcihwYXJhbXNbMF0pOw0KICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGU7DQogICAgICAgICAgDQogICAgICAgICAgaWYoaXNfY2x1c3Rlcil7DQogICAgICAgICAgICBzZWxlY3RlZE5vZGUgPSBpbnN0YW5jZS5uZXR3b3JrLmdldE5vZGVzSW5DbHVzdGVyKHBhcmFtc1swXSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHNlbGVjdGVkTm9kZSA9IHBhcmFtczsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICB2YXIgdXBkYXRlQXJyYXkgPSBbXTsNCiAgICAgICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaWRzZWxlY3Rpb24pew0KICAgICAgICAgICAgc2VsZWN0Tm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub2RlU2VsZWN0JytlbC5pZCk7DQogICAgICAgICAgICBpZihpc19jbHVzdGVyID09PSBmYWxzZSl7DQogICAgICAgICAgICAgIGlmKHguaWRzZWxlY3Rpb24udmFsdWVzICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgICAgIGlmKGluZGV4T2YuY2FsbCh4Lmlkc2VsZWN0aW9uLnZhbHVlcywgc2VsZWN0ZWROb2RlWzBdLCB0cnVlKSA+IC0xKXsNCiAgICAgICAgICAgICAgICAgIHNlbGVjdE5vZGUudmFsdWUgPSBzZWxlY3RlZE5vZGVbMF07DQogICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICBzZWxlY3ROb2RlLnZhbHVlID0gIiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICBzZWxlY3ROb2RlLnZhbHVlID0gc2VsZWN0ZWROb2RlWzBdOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGlmICh3aW5kb3cuU2hpbnkpew0KICAgICAgICAgICAgICAgIGNoYW5nZUlucHV0KCdzZWxlY3RlZCcsIHNlbGVjdE5vZGUudmFsdWUpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRBY3RpdmUgPSB0cnVlOw0KICAgICAgICAgIHZhciBpLGo7DQogICAgICAgICAgdmFyIGRlZ3JlZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuZGVncmVlOw0KICAgICAgICAgIA0KICAgICAgICAgIC8vIG1hcmsgYWxsIG5vZGVzIGFzIGhhcmQgdG8gcmVhZC4NCiAgICAgICAgICBmb3IgKHZhciBub2RlSWQgaW4gaW5zdGFuY2UubmV0d29yay5ib2R5Lm5vZGVzKSB7DQogICAgICAgICAgICBpZihpbnN0YW5jZS5uZXR3b3JrLmlzQ2x1c3Rlcihub2RlSWQpKXsNCiAgICAgICAgICAgICAgbm9kZUFzSGFyZFRvUmVhZChpbnN0YW5jZS5uZXR3b3JrLmJvZHkubm9kZXNbbm9kZUlkXSwgaW5zdGFuY2UubmV0d29yay5ncm91cHMsIG9wdGlvbnMsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRDb2xvciwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uQ29sb3IsIGluc3RhbmNlLm5ldHdvcmssICJjbHVzdGVyIik7DQogICAgICAgICAgICB9ZWxzZSB7DQogICAgICAgICAgICAgIHZhciB0bXBfbm9kZSA9IGFsbE5vZGVzW25vZGVJZF07DQogICAgICAgICAgICAgIGlmKHRtcF9ub2RlICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgICAgIG5vZGVBc0hhcmRUb1JlYWQodG1wX25vZGUsIGluc3RhbmNlLm5ldHdvcmsuZ3JvdXBzLCBvcHRpb25zLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0Q29sb3IsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ieXNlbGVjdGlvbkNvbG9yLCBpbnN0YW5jZS5uZXR3b3JrLCAibm9kZSIpOw0KICAgICAgICAgICAgICAgIHRtcF9ub2RlLnggPSB1bmRlZmluZWQ7DQogICAgICAgICAgICAgICAgdG1wX25vZGUueSA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiANCiAgICAgICAgICBpZihhbGdvcml0aG0gPT09ICJhbGwiKXsNCiAgICAgICAgICAgIHZhciBjb25uZWN0ZWROb2RlczsNCiAgICAgICAgICAgIGlmKGRlZ3JlZXMgPiAwKXsNCiAgICAgICAgICAgICAgY29ubmVjdGVkTm9kZXMgPSBbXTsNCiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNlbGVjdGVkTm9kZS5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgIGNvbm5lY3RlZE5vZGVzID0gY29ubmVjdGVkTm9kZXMuY29uY2F0KGluc3RhbmNlLm5ldHdvcmsuZ2V0Q29ubmVjdGVkTm9kZXMoc2VsZWN0ZWROb2RlW2pdLCB0cnVlKSk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgY29ubmVjdGVkTm9kZXMgPSB1bmlxdWVBcnJheShjb25uZWN0ZWROb2RlcywgdHJ1ZSwgaW5zdGFuY2UubmV0d29yayk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgY29ubmVjdGVkTm9kZXMgPSBzZWxlY3RlZE5vZGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIHZhciBhbGxDb25uZWN0ZWROb2RlcyA9IFtdOw0KICAgICAgICAgICAgLy8gZ2V0IHRoZSBub2RlcyB0byBjb2xvcg0KICAgICAgICAgICAgaWYoZGVncmVlcyA+PSAyKXsNCiAgICAgICAgICAgICAgZm9yIChpID0gMjsgaSA8PSBkZWdyZWVzOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNfY29ubmVjdGVkTm9kZXMgPSBjb25uZWN0ZWROb2RlczsNCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudGxlbmd0aCA9IGNvbm5lY3RlZE5vZGVzLmxlbmd0aDsNCiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY3VycmVudGxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICBjb25uZWN0ZWROb2RlcyA9IHVuaXF1ZUFycmF5KGNvbm5lY3RlZE5vZGVzLmNvbmNhdChpbnN0YW5jZS5uZXR3b3JrLmdldENvbm5lY3RlZE5vZGVzKGNvbm5lY3RlZE5vZGVzW2pdKSksIHRydWUsIGluc3RhbmNlLm5ldHdvcmspOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGVkTm9kZXMubGVuZ3RoID09PSBwcmV2aW91c19jb25uZWN0ZWROb2Rlcy5sZW5ndGgpIHsgYnJlYWs7IH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gbm9kZXMgdG8ganVzdCBsYWJlbA0KICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvbm5lY3RlZE5vZGVzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgYWxsQ29ubmVjdGVkTm9kZXMgPSBhbGxDb25uZWN0ZWROb2Rlcy5jb25jYXQoaW5zdGFuY2UubmV0d29yay5nZXRDb25uZWN0ZWROb2Rlcyhjb25uZWN0ZWROb2Rlc1tqXSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWxsQ29ubmVjdGVkTm9kZXMgPSB1bmlxdWVBcnJheShhbGxDb25uZWN0ZWROb2RlcywgdHJ1ZSwgaW5zdGFuY2UubmV0d29yayk7DQoNCiAgICAgICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRMYWJlbE9ubHkgPT09IHRydWUpew0KICAgICAgICAgICAgICAvLyBhbGwgaGlnaGVyIGRlZ3JlZSBub2RlcyBnZXQgYSBkaWZmZXJlbnQgY29sb3IgYW5kIHRoZWlyIGxhYmVsIGJhY2sNCiAgICAgICAgICAgICAgYXJyYXlfY2x1c3Rlcl9pZCA9IFtdOw0KICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWxsQ29ubmVjdGVkTm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAoYWxsTm9kZXNbYWxsQ29ubmVjdGVkTm9kZXNbaV1dLmhpZGRlbkxhYmVsICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgIGFsbE5vZGVzW2FsbENvbm5lY3RlZE5vZGVzW2ldXS5sYWJlbCA9IGFsbE5vZGVzW2FsbENvbm5lY3RlZE5vZGVzW2ldXS5oaWRkZW5MYWJlbDsNCiAgICAgICAgICAgICAgICAgIGFsbE5vZGVzW2FsbENvbm5lY3RlZE5vZGVzW2ldXS5oaWRkZW5MYWJlbCA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgICAgICAgIGlmKGhhdmVfY2x1c3Rlcl9ub2Rlcyl7DQogICAgICAgICAgICAgICAgICAgIGlmKGluZGV4T2YuY2FsbChub2Rlc19pbl9jbHVzdGVycywgYWxsQ29ubmVjdGVkTm9kZXNbaV0sIHRydWUpID4gLTEpew0KICANCiAgICAgICAgICAgICAgICAgICAgICBhcnJheV9jbHVzdGVyX2lkID0gYXJyYXlfY2x1c3Rlcl9pZC5jb25jYXQoaW5zdGFuY2UubmV0d29yay5jbHVzdGVyaW5nLmZpbmROb2RlKGFsbENvbm5lY3RlZE5vZGVzW2ldKVswXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgDQogICAgICAgICAgICAgIGlmKGFycmF5X2NsdXN0ZXJfaWQubGVuZ3RoID4gMCl7DQogICAgICAgICAgICAgICAgYXJyYXlfY2x1c3Rlcl9pZCA9IHVuaXF1ZUFycmF5KGFycmF5X2NsdXN0ZXJfaWQsIGZhbHNlLCBpbnN0YW5jZS5uZXR3b3JrKTsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyYXlfY2x1c3Rlcl9pZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgaW5zdGFuY2UubmV0d29yay5ib2R5Lm5vZGVzW2FycmF5X2NsdXN0ZXJfaWRbaV1dLnNldE9wdGlvbnMoe2xhYmVsIDogaW5zdGFuY2UubmV0d29yay5ib2R5Lm5vZGVzW2FycmF5X2NsdXN0ZXJfaWRbaV1dLm9wdGlvbnMuaGlkZGVuTGFiZWwsIGhpZGRlbkxhYmVsOnVuZGVmaW5lZH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIGFsbCBpbiBkZWdyZWUgbm9kZXMgZ2V0IHRoZWlyIG93biBjb2xvciBhbmQgdGhlaXIgbGFiZWwgYmFjayArIG1haW4gbm9kZXMNCiAgICAgICAgICAgIGNvbm5lY3RlZE5vZGVzID0gY29ubmVjdGVkTm9kZXMuY29uY2F0KHNlbGVjdGVkTm9kZSk7DQogICAgICAgICAgICBhcnJheV9jbHVzdGVyX2lkID0gW107DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29ubmVjdGVkTm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgcmVzZXRPbmVOb2RlKGFsbE5vZGVzW2Nvbm5lY3RlZE5vZGVzW2ldXSwgaW5zdGFuY2UubmV0d29yay5ncm91cHMsIG9wdGlvbnMsIGluc3RhbmNlLm5ldHdvcmspOw0KICAgICAgICAgICAgICBpZihoYXZlX2NsdXN0ZXJfbm9kZXMpew0KICAgICAgICAgICAgICAgIGlmKGluZGV4T2YuY2FsbChub2Rlc19pbl9jbHVzdGVycywgY29ubmVjdGVkTm9kZXNbaV0sIHRydWUpID4gLTEpew0KICAgICAgICAgICAgICAgICAgYXJyYXlfY2x1c3Rlcl9pZCA9IGFycmF5X2NsdXN0ZXJfaWQuY29uY2F0KGluc3RhbmNlLm5ldHdvcmsuY2x1c3RlcmluZy5maW5kTm9kZShjb25uZWN0ZWROb2Rlc1tpXSlbMF0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZihhcnJheV9jbHVzdGVyX2lkLmxlbmd0aCA+IDApew0KICAgICAgICAgICAgICBhcnJheV9jbHVzdGVyX2lkID0gdW5pcXVlQXJyYXkoYXJyYXlfY2x1c3Rlcl9pZCwgZmFsc2UsIGluc3RhbmNlLm5ldHdvcmspOw0KICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyYXlfY2x1c3Rlcl9pZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHJlc2V0T25lQ2x1c3RlcihpbnN0YW5jZS5uZXR3b3JrLmJvZHkubm9kZXNbYXJyYXlfY2x1c3Rlcl9pZFtpXV0sIGluc3RhbmNlLm5ldHdvcmsuZ3JvdXBzLCBvcHRpb25zLCBpbnN0YW5jZS5uZXR3b3JrKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAvLyBzZXQgc29tZSBlZGdlcyBhcyBoYXJkIHRvIHJlYWQNCiAgICAgICAgICAgIHZhciBlZGdlc0hhcmRUb1JlYWQgPSBlZGdlcy5nZXQoew0KICAgICAgICAgICAgICBmaWVsZHM6IFsnaWQnLCAnY29sb3InLCAnaGlkZGVuQ29sb3InLCAnaGlkZGVuTGFiZWwnLCAnbGFiZWwnXSwNCiAgICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiAoaXRlbSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAoKGluZGV4T2YuY2FsbChjb25uZWN0ZWROb2RlcywgaXRlbS5mcm9tLCB0cnVlKSA9PT0gLTEpKSA7DQogICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgIHJldHVyblR5cGUgOidBcnJheScNCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAvLyBhbGwgaW4gZGVncmVlIG5vZGVzIGdldCB0aGVpciBvd24gY29sb3IgYW5kIHRoZWlyIGxhYmVsIGJhY2sNCiAgICAgICAgICAgIGFycmF5X2NsdXN0ZXJfaWQgPSBbXTsNCiAgICAgICAgICAgIHZhciB0bXBfY2x1c3Rlcl9pZDsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlZGdlc0hhcmRUb1JlYWQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgZWRnZUFzSGFyZFRvUmVhZChlZGdlc0hhcmRUb1JlYWRbaV0sIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRDb2xvciwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uQ29sb3IsIGluc3RhbmNlLm5ldHdvcmssIHR5cGUgPSAiZWRnZSIpDQogICAgICAgICAgICAgIGlmKGhhdmVfY2x1c3Rlcl9ub2Rlcyl7DQogICAgICAgICAgICAgICAgaWYoaW5kZXhPZi5jYWxsKGVkZ2VzX2luX2NsdXN0ZXJzLCBlZGdlc0hhcmRUb1JlYWRbaV0uaWQsIHRydWUpID4gLTEpew0KICAgICAgICAgICAgICAgICAgdG1wX2NsdXN0ZXJfaWQgPSBpbnN0YW5jZS5uZXR3b3JrLmNsdXN0ZXJpbmcuZ2V0Q2x1c3RlcmVkRWRnZXMoZWRnZXNIYXJkVG9SZWFkW2ldLmlkKTsNCiAgICAgICAgICAgICAgICAgIGlmKHRtcF9jbHVzdGVyX2lkLmxlbmd0aCA+IDEpew0KICAgICAgICAgICAgICAgICAgICBhcnJheV9jbHVzdGVyX2lkID0gYXJyYXlfY2x1c3Rlcl9pZC5jb25jYXQodG1wX2NsdXN0ZXJfaWRbMF0pOw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZihhcnJheV9jbHVzdGVyX2lkLmxlbmd0aCA+IDApew0KICAgICAgICAgICAgICBhcnJheV9jbHVzdGVyX2lkID0gdW5pcXVlQXJyYXkoYXJyYXlfY2x1c3Rlcl9pZCwgZmFsc2UsIGluc3RhbmNlLm5ldHdvcmspOw0KICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyYXlfY2x1c3Rlcl9pZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGVkZ2VBc0hhcmRUb1JlYWQoaW5zdGFuY2UubmV0d29yay5ib2R5LmVkZ2VzW2FycmF5X2NsdXN0ZXJfaWRbaV1dLm9wdGlvbnMsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRDb2xvciwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uQ29sb3IsIGluc3RhbmNlLm5ldHdvcmssIHR5cGUgPSAiY2x1c3RlciIpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVkZ2VzLnVwZGF0ZShlZGdlc0hhcmRUb1JlYWQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgfSBlbHNlIGlmKGFsZ29yaXRobSA9PT0gImhpZXJhcmNoaWNhbCIpew0KICAgICAgICAgICAgDQogICAgICAgICAgICB2YXIgZGVncmVlX2Zyb20gPSBkZWdyZWVzLmZyb207DQogICAgICAgICAgICB2YXIgZGVncmVlX3RvID0gZGVncmVlcy50bzsNCiAgICAgICAgICAgIGRlZ3JlZXMgPSBNYXRoLm1heChkZWdyZWVfZnJvbSwgZGVncmVlX3RvKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdmFyIGFsbENvbm5lY3RlZE5vZGVzID0gW107DQogICAgICAgICAgICB2YXIgY3VycmVudENvbm5lY3RlZEZyb21Ob2RlcyA9IFtdOw0KICAgICAgICAgICAgdmFyIGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzID0gW107DQogICAgICAgICAgICB2YXIgY29ubmVjdGVkRnJvbU5vZGVzID0gW107DQogICAgICAgICAgICB2YXIgY29ubmVjdGVkVG9Ob2RlcyA9IFtdOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZihkZWdyZWVfZnJvbSA+IDApew0KICAgICAgICAgICAgICBjb25uZWN0ZWRGcm9tTm9kZXMgPSBlZGdlcy5nZXQoew0KICAgICAgICAgICAgICAgIGZpZWxkczogWydmcm9tJ10sDQogICAgICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiAoaXRlbSkgew0KICAgICAgICAgICAgICAgICAgcmV0dXJuICgoaW5kZXhPZi5jYWxsKHNlbGVjdGVkTm9kZSwgaXRlbS50bywgdHJ1ZSkgIT09IC0xKSkgOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA6J0FycmF5Jw0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYoZGVncmVlX3RvID4gMCl7DQogICAgICAgICAgICAgIGNvbm5lY3RlZFRvTm9kZXMgPSBlZGdlcy5nZXQoew0KICAgICAgICAgICAgICAgIGZpZWxkczogWyd0byddLA0KICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24gKGl0ZW0pIHsNCiAgICAgICAgICAgICAgICAgIHJldHVybiAoKGluZGV4T2YuY2FsbChzZWxlY3RlZE5vZGUsIGl0ZW0uZnJvbSwgdHJ1ZSkgIT09IC0xKSkgOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA6J0FycmF5Jw0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb25uZWN0ZWRGcm9tTm9kZXMubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICBhbGxDb25uZWN0ZWROb2RlcyA9IGFsbENvbm5lY3RlZE5vZGVzLmNvbmNhdChjb25uZWN0ZWRGcm9tTm9kZXNbal0uZnJvbSk7DQogICAgICAgICAgICAgICAgY3VycmVudENvbm5lY3RlZEZyb21Ob2RlcyA9IGN1cnJlbnRDb25uZWN0ZWRGcm9tTm9kZXMuY29uY2F0KGNvbm5lY3RlZEZyb21Ob2Rlc1tqXS5mcm9tKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvbm5lY3RlZFRvTm9kZXMubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICBhbGxDb25uZWN0ZWROb2RlcyA9IGFsbENvbm5lY3RlZE5vZGVzLmNvbmNhdChjb25uZWN0ZWRUb05vZGVzW2pdLnRvKTsNCiAgICAgICAgICAgICAgICBjdXJyZW50Q29ubmVjdGVkVG9Ob2RlcyA9IGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzLmNvbmNhdChjb25uZWN0ZWRUb05vZGVzW2pdLnRvKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdmFyIGdvX2Zyb207DQogICAgICAgICAgICB2YXIgZ29fdG87DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpZihkZWdyZWVzID4gMSl7DQogICAgICAgICAgICAgIGZvciAoaSA9IDI7IGkgPD0gZGVncmVlczsgaSsrKSB7DQogICAgICAgICAgICAgICAgZ29fZnJvbSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGdvX3RvID0gZmFsc2U7DQogICAgICAgICAgICAgICAgaWYoY3VycmVudENvbm5lY3RlZEZyb21Ob2Rlcy5sZW5ndGggPiAwICYmIGkgPD0gZGVncmVlX2Zyb20pew0KICAgICAgICAgICAgICAgICAgY29ubmVjdGVkRnJvbU5vZGVzID0gZWRnZXMuZ2V0KHsNCiAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBbJ2Zyb20nXSwNCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiAoaXRlbSkgew0KICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleE9mLmNhbGwoY3VycmVudENvbm5lY3RlZEZyb21Ob2RlcywgaXRlbS50bywgdHJ1ZSkgPiAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA6J0FycmF5Jw0KICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICBnb19mcm9tID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZihjdXJyZW50Q29ubmVjdGVkVG9Ob2Rlcy5sZW5ndGggPiAwICYmIGkgPD0gZGVncmVlX3RvKXsNCiAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZFRvTm9kZXMgPSBlZGdlcy5nZXQoew0KICAgICAgICAgICAgICAgICAgICBmaWVsZHM6IFsndG8nXSwNCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiAoaXRlbSkgew0KICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleE9mLmNhbGwoY3VycmVudENvbm5lY3RlZFRvTm9kZXMsIGl0ZW0uZnJvbSwgdHJ1ZSkgPiAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA6J0FycmF5Jw0KICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICBnb190byA9IHRydWU7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYoZ29fZnJvbSA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgICAgICBjdXJyZW50Q29ubmVjdGVkRnJvbU5vZGVzID0gW107DQogICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29ubmVjdGVkRnJvbU5vZGVzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgIGFsbENvbm5lY3RlZE5vZGVzID0gYWxsQ29ubmVjdGVkTm9kZXMuY29uY2F0KGNvbm5lY3RlZEZyb21Ob2Rlc1tqXS5mcm9tKTsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbm5lY3RlZEZyb21Ob2RlcyA9IGN1cnJlbnRDb25uZWN0ZWRGcm9tTm9kZXMuY29uY2F0KGNvbm5lY3RlZEZyb21Ob2Rlc1tqXS5mcm9tKTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZihnb190byA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgICAgICBjdXJyZW50Q29ubmVjdGVkVG9Ob2RlcyA9IFtdOw0KICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvbm5lY3RlZFRvTm9kZXMubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgYWxsQ29ubmVjdGVkTm9kZXMgPSBhbGxDb25uZWN0ZWROb2Rlcy5jb25jYXQoY29ubmVjdGVkVG9Ob2Rlc1tqXS50byk7DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzID0gY3VycmVudENvbm5lY3RlZFRvTm9kZXMuY29uY2F0KGNvbm5lY3RlZFRvTm9kZXNbal0udG8pOw0KICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKGdvX2Zyb20gPT09IGZhbHNlICYmICBnb190byA9PT0gZmFsc2UpIHsgYnJlYWs7fQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGFsbENvbm5lY3RlZE5vZGVzID0gdW5pcXVlQXJyYXkoYWxsQ29ubmVjdGVkTm9kZXMsIHRydWUsIGluc3RhbmNlLm5ldHdvcmspLmNvbmNhdChzZWxlY3RlZE5vZGUpOw0KDQogICAgICAgICAgICB2YXIgbm9kZXNXaXRoTGFiZWwgPSBbXTsNCiAgICAgICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRMYWJlbE9ubHkgPT09IHRydWUpew0KICAgICAgICAgICAgICBpZihkZWdyZWVzID4gMCl7DQogICAgICAgICAgICAgICAgLy8gbm9kZXMgdG8ganVzdCBsYWJlbA0KICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdXJyZW50Q29ubmVjdGVkVG9Ob2Rlcy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICBub2Rlc1dpdGhMYWJlbCA9IG5vZGVzV2l0aExhYmVsLmNvbmNhdChpbnN0YW5jZS5uZXR3b3JrLmdldENvbm5lY3RlZE5vZGVzKGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzW2pdKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdXJyZW50Q29ubmVjdGVkRnJvbU5vZGVzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgIG5vZGVzV2l0aExhYmVsID0gbm9kZXNXaXRoTGFiZWwuY29uY2F0KGluc3RhbmNlLm5ldHdvcmsuZ2V0Q29ubmVjdGVkTm9kZXMoY3VycmVudENvbm5lY3RlZEZyb21Ob2Rlc1tqXSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBub2Rlc1dpdGhMYWJlbCA9IHVuaXF1ZUFycmF5KG5vZGVzV2l0aExhYmVsLCB0cnVlLCBpbnN0YW5jZS5uZXR3b3JrKTsNCiAgICAgICAgICAgICAgfSBlbHNlew0KICAgICAgICAgICAgICAgIG5vZGVzV2l0aExhYmVsID0gY3VycmVudENvbm5lY3RlZFRvTm9kZXM7DQogICAgICAgICAgICAgICAgbm9kZXNXaXRoTGFiZWwgPSBub2Rlc1dpdGhMYWJlbC5jb25jYXQoY3VycmVudENvbm5lY3RlZEZyb21Ob2Rlcyk7DQogICAgICAgICAgICAgICAgbm9kZXNXaXRoTGFiZWwgPSB1bmlxdWVBcnJheShub2Rlc1dpdGhMYWJlbCwgdHJ1ZSwgaW5zdGFuY2UubmV0d29yayk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIGFsbCBoaWdoZXIgZGVncmVlIG5vZGVzIGdldCBhIGRpZmZlcmVudCBjb2xvciBhbmQgdGhlaXIgbGFiZWwgYmFjaw0KICAgICAgICAgICAgYXJyYXlfY2x1c3Rlcl9pZCA9IFtdOw0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5vZGVzV2l0aExhYmVsLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgIGlmIChhbGxOb2Rlc1tub2Rlc1dpdGhMYWJlbFtpXV0uaGlkZGVuTGFiZWwgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIGFsbE5vZGVzW25vZGVzV2l0aExhYmVsW2ldXS5sYWJlbCA9IGFsbE5vZGVzW25vZGVzV2l0aExhYmVsW2ldXS5oaWRkZW5MYWJlbDsNCiAgICAgICAgICAgICAgICBhbGxOb2Rlc1tub2Rlc1dpdGhMYWJlbFtpXV0uaGlkZGVuTGFiZWwgPSB1bmRlZmluZWQ7DQogICAgICAgICAgICAgICAgaWYoaGF2ZV9jbHVzdGVyX25vZGVzKXsNCiAgICAgICAgICAgICAgICAgIGlmKGluZGV4T2YuY2FsbChub2Rlc19pbl9jbHVzdGVycywgbm9kZXNXaXRoTGFiZWxbaV0sIHRydWUpID4gLTEpew0KICAgICAgICAgICAgICAgICAgICBhcnJheV9jbHVzdGVyX2lkID0gYXJyYXlfY2x1c3Rlcl9pZC5jb25jYXQoaW5zdGFuY2UubmV0d29yay5jbHVzdGVyaW5nLmZpbmROb2RlKG5vZGVzV2l0aExhYmVsW2ldKVswXSk7DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmKGFycmF5X2NsdXN0ZXJfaWQubGVuZ3RoID4gMCl7DQogICAgICAgICAgICAgIGFycmF5X2NsdXN0ZXJfaWQgPSB1bmlxdWVBcnJheShhcnJheV9jbHVzdGVyX2lkLCBmYWxzZSwgaW5zdGFuY2UubmV0d29yayk7DQogICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnJheV9jbHVzdGVyX2lkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaW5zdGFuY2UubmV0d29yay5ib2R5Lm5vZGVzW2FycmF5X2NsdXN0ZXJfaWRbaV1dLnNldE9wdGlvbnMoe2xhYmVsIDogaW5zdGFuY2UubmV0d29yay5ib2R5Lm5vZGVzW2FycmF5X2NsdXN0ZXJfaWRbaV1dLm9wdGlvbnMuaGlkZGVuTGFiZWwsIGhpZGRlbkxhYmVsOnVuZGVmaW5lZH0pDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gYWxsIGluIGRlZ3JlZSBub2RlcyBnZXQgdGhlaXIgb3duIGNvbG9yIGFuZCB0aGVpciBsYWJlbCBiYWNrDQogICAgICAgICAgICBhcnJheV9jbHVzdGVyX2lkID0gW107DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWxsQ29ubmVjdGVkTm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgcmVzZXRPbmVOb2RlKGFsbE5vZGVzW2FsbENvbm5lY3RlZE5vZGVzW2ldXSwgaW5zdGFuY2UubmV0d29yay5ncm91cHMsIG9wdGlvbnMsIGluc3RhbmNlLm5ldHdvcmspOw0KICAgICAgICAgICAgICBpZihoYXZlX2NsdXN0ZXJfbm9kZXMpew0KICAgICAgICAgICAgICAgIGlmKGluZGV4T2YuY2FsbChub2Rlc19pbl9jbHVzdGVycywgYWxsQ29ubmVjdGVkTm9kZXNbaV0sIHRydWUpID4gLTEpew0KICAgICAgICAgICAgICAgICAgYXJyYXlfY2x1c3Rlcl9pZCA9IGFycmF5X2NsdXN0ZXJfaWQuY29uY2F0KGluc3RhbmNlLm5ldHdvcmsuY2x1c3RlcmluZy5maW5kTm9kZShhbGxDb25uZWN0ZWROb2Rlc1tpXSlbMF0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZihhcnJheV9jbHVzdGVyX2lkLmxlbmd0aCA+IDApew0KICAgICAgICAgICAgICBhcnJheV9jbHVzdGVyX2lkID0gdW5pcXVlQXJyYXkoYXJyYXlfY2x1c3Rlcl9pZCwgZmFsc2UsIGluc3RhbmNlLm5ldHdvcmspOw0KICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyYXlfY2x1c3Rlcl9pZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICByZXNldE9uZUNsdXN0ZXIoaW5zdGFuY2UubmV0d29yay5ib2R5Lm5vZGVzW2FycmF5X2NsdXN0ZXJfaWRbaV1dLCBpbnN0YW5jZS5uZXR3b3JrLmdyb3Vwcywgb3B0aW9ucywgaW5zdGFuY2UubmV0d29yayk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICANCiAgICAgICAgICAgIC8vIHNldCBzb21lIGVkZ2VzIGFzIGhhcmQgdG8gcmVhZA0KICAgICAgICAgICAgdmFyIGVkZ2VzSGFyZFRvUmVhZCA9IGVkZ2VzLmdldCh7DQogICAgICAgICAgICAgIGZpZWxkczogWydpZCcsICdjb2xvcicsICdoaWRkZW5Db2xvcicsICdoaWRkZW5MYWJlbCcsICdsYWJlbCddLA0KICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChpdGVtKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICgoaW5kZXhPZi5jYWxsKGFsbENvbm5lY3RlZE5vZGVzLCBpdGVtLmZyb20sIHRydWUpID09PSAtMSkgIHx8IChpbmRleE9mLmNhbGwoYWxsQ29ubmVjdGVkTm9kZXMsIGl0ZW0udG8sIHRydWUpID09PSAtMSkpIDsNCiAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgcmV0dXJuVHlwZSA6J0FycmF5Jw0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIGFycmF5X2NsdXN0ZXJfaWQgPSBbXTsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlZGdlc0hhcmRUb1JlYWQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgZWRnZUFzSGFyZFRvUmVhZChlZGdlc0hhcmRUb1JlYWRbaV0sIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRDb2xvciwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uQ29sb3IsIGluc3RhbmNlLm5ldHdvcmssIHR5cGUgPSAiZWRnZSIpDQogICAgICAgICAgICAgIGlmKGhhdmVfY2x1c3Rlcl9ub2Rlcyl7DQogICAgICAgICAgICAgICAgaWYoaW5kZXhPZi5jYWxsKGVkZ2VzX2luX2NsdXN0ZXJzLCBlZGdlc0hhcmRUb1JlYWRbaV0uaWQsIHRydWUpID4gLTEpew0KICAgICAgICAgICAgICAgICAgdmFyIHRtcF9jbHVzdGVyX2lkID0gaW5zdGFuY2UubmV0d29yay5jbHVzdGVyaW5nLmdldENsdXN0ZXJlZEVkZ2VzKGVkZ2VzSGFyZFRvUmVhZFtpXS5pZCk7DQogICAgICAgICAgICAgICAgICBpZih0bXBfY2x1c3Rlcl9pZC5sZW5ndGggPiAxKXsNCiAgICAgICAgICAgICAgICAgICAgYXJyYXlfY2x1c3Rlcl9pZCA9IGFycmF5X2NsdXN0ZXJfaWQuY29uY2F0KHRtcF9jbHVzdGVyX2lkWzBdKTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYoYXJyYXlfY2x1c3Rlcl9pZC5sZW5ndGggPiAwKXsNCiAgICAgICAgICAgICAgYXJyYXlfY2x1c3Rlcl9pZCA9IHVuaXF1ZUFycmF5KGFycmF5X2NsdXN0ZXJfaWQsIGZhbHNlLCBpbnN0YW5jZS5uZXR3b3JrKTsNCiAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFycmF5X2NsdXN0ZXJfaWQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgZWRnZUFzSGFyZFRvUmVhZChpbnN0YW5jZS5uZXR3b3JrLmJvZHkuZWRnZXNbYXJyYXlfY2x1c3Rlcl9pZFtpXV0ub3B0aW9ucywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodENvbG9yLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb25Db2xvciwgaW5zdGFuY2UubmV0d29yaywgdHlwZSA9ICJjbHVzdGVyIik7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZWRnZXMudXBkYXRlKGVkZ2VzSGFyZFRvUmVhZCk7DQogICAgICAgICAgICANCiAgICAgICAgICB9DQoNCiAgICAgICAgICBpZih1cGRhdGUpew0KICAgICAgICAgICAgaWYoIShhY3Rpb25fdHlwZSA9PSAiaG92ZXIiKSl7DQogICAgICAgICAgICAgICBpc19jbGlja2VkID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIHRyYW5zZm9ybSB0aGUgb2JqZWN0IGludG8gYW4gYXJyYXkNCiAgICAgICAgICAgIHZhciB1cGRhdGVBcnJheSA9IFtdOw0KICAgICAgICAgICAgZm9yIChub2RlSWQgaW4gYWxsTm9kZXMpIHsNCiAgICAgICAgICAgICAgaWYgKGFsbE5vZGVzLmhhc093blByb3BlcnR5KG5vZGVJZCkpIHsNCiAgICAgICAgICAgICAgICB1cGRhdGVBcnJheS5wdXNoKGFsbE5vZGVzW25vZGVJZF0pOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBub2Rlcy51cGRhdGUodXBkYXRlQXJyYXkpOw0KICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgaXNfY2xpY2tlZCA9IGZhbHNlOw0KICAgICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodEFjdGl2ZSA9PT0gdHJ1ZSB8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5zZWxlY3RBY3RpdmUgPT09IHRydWUpIHsNCiAgICAgICAgICAvLyByZXNldCBub2RlU2VsZWN0IGxpc3QgaWYgYWN0aXZlZA0KICAgICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5pZHNlbGVjdGlvbil7DQogICAgICAgICAgICByZXNldExpc3QoIm5vZGVTZWxlY3QiLCBlbC5pZCwgJ3NlbGVjdGVkJyk7DQogICAgICAgICAgfQ0KICAgICAgICAgIC8vcmVzZXQgbm9kZXMNCiAgICAgICAgICByZXNldEFsbE5vZGVzKG5vZGVzLCB1cGRhdGUsIGluc3RhbmNlLm5ldHdvcmsuZ3JvdXBzLCBvcHRpb25zLCBpbnN0YW5jZS5uZXR3b3JrKQ0KICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRBY3RpdmUgPSBmYWxzZTsNCiAgICAgICAgICBpc19jbGlja2VkID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIC8vIHJlc2V0IHNlbGVjdGVkQnkgbGlzdCBpZiBhY3RpdmVkDQogICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb24pew0KICAgICAgICByZXNldExpc3QoInNlbGVjdGVkQnkiLCBlbC5pZCwgJ3NlbGVjdGVkQnknKTsNCiAgICAgIH0NCiAgICB9DQogICAgDQogICAgZnVuY3Rpb24gb25DbGlja0lEU2VsZWN0aW9uKHNlbGVjdGVkSXRlbXMpIHsNCiAgICAgIHZhciBzZWxlY3ROb2RlOw0KICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmlkc2VsZWN0aW9uKXsNCiAgICAgICAgaWYgKHNlbGVjdGVkSXRlbXMubm9kZXMubGVuZ3RoICE9PSAwKSB7DQogICAgICAgICAgc2VsZWN0Tm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub2RlU2VsZWN0JytlbC5pZCk7DQogICAgICAgICAgaWYoeC5pZHNlbGVjdGlvbi52YWx1ZXMgIT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICBpZihpbmRleE9mLmNhbGwoeC5pZHNlbGVjdGlvbi52YWx1ZXMsIHNlbGVjdGVkSXRlbXMubm9kZXNbMF0sIHRydWUpID4gLTEpew0KICAgICAgICAgICAgICBzZWxlY3ROb2RlLnZhbHVlID0gc2VsZWN0ZWRJdGVtcy5ub2RlczsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICBzZWxlY3ROb2RlLnZhbHVlID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBzZWxlY3ROb2RlLnZhbHVlID0gc2VsZWN0ZWRJdGVtcy5ub2RlczsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHdpbmRvdy5TaGlueSl7DQogICAgICAgICAgICBjaGFuZ2VJbnB1dCgnc2VsZWN0ZWQnLCBzZWxlY3ROb2RlLnZhbHVlKTsNCiAgICAgICAgICB9DQogICAgICAgIH1lbHNlew0KICAgICAgICAgIHJlc2V0TGlzdCgibm9kZVNlbGVjdCIsIGVsLmlkLCAnc2VsZWN0ZWQnKTsNCiAgICAgICAgfSANCiAgICAgIH0NCiAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ieXNlbGVjdGlvbil7DQogICAgICAgIC8vIHJlc2V0IHNlbGVjdGVkQnkgbGlzdCBpZiBhY3RpdmVkDQogICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLm5vZGVzLmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgIHJlc2V0TGlzdCgic2VsZWN0ZWRCeSIsIGVsLmlkLCAnc2VsZWN0ZWRCeScpOw0KICAgICAgICAgIHNlbGVjdGVkSGlnaGxpZ2h0KCIiKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAvLyBzaGFyZWQgY2xpY2sgZnVuY3Rpb24gKHNlbGVjdGVkTm9kZXMpDQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitlbC5pZCkubXljbGljayA9IGZ1bmN0aW9uKHBhcmFtcyl7DQogICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHQgJiYgeC5ub2Rlcyl7DQogICAgICAgICAgbmVpZ2hib3VyaG9vZEhpZ2hsaWdodChwYXJhbXMubm9kZXMsICJjbGljayIsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRBbGdvcml0aG0pOw0KICAgICAgICB9ZWxzZSBpZigoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmlkc2VsZWN0aW9uIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ieXNlbGVjdGlvbikgJiYgeC5ub2Rlcyl7DQogICAgICAgICAgb25DbGlja0lEU2VsZWN0aW9uKHBhcmFtcykNCiAgICAgICAgfSANCiAgICB9Ow0KICAgIA0KICAgIC8vIFNldCBldmVudCBpbiByZWxhdGlvbiB3aXRoIGhpZ2hsaWdodE5lYXJlc3QgICAgICANCiAgICBpbnN0YW5jZS5uZXR3b3JrLm9uKCJjbGljayIsIGZ1bmN0aW9uKHBhcmFtcyl7DQogICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHQgJiYgeC5ub2Rlcyl7DQogICAgICAgICAgbmVpZ2hib3VyaG9vZEhpZ2hsaWdodChwYXJhbXMubm9kZXMsICJjbGljayIsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRBbGdvcml0aG0pOw0KICAgICAgICB9ZWxzZSBpZigoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmlkc2VsZWN0aW9uIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ieXNlbGVjdGlvbikgJiYgeC5ub2Rlcyl7DQogICAgICAgICAgb25DbGlja0lEU2VsZWN0aW9uKHBhcmFtcykNCiAgICAgICAgfSANCiAgICB9KTsNCiAgICANCiAgICBpbnN0YW5jZS5uZXR3b3JrLm9uKCJob3Zlck5vZGUiLCBmdW5jdGlvbihwYXJhbXMpew0KICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhvdmVyTmVhcmVzdCAmJiB4Lm5vZGVzKXsNCiAgICAgICAgbmVpZ2hib3VyaG9vZEhpZ2hsaWdodChbcGFyYW1zLm5vZGVdLCAiaG92ZXIiLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0QWxnb3JpdGhtKTsNCiAgICAgIH0gDQogICAgfSk7DQoNCiAgICBpbnN0YW5jZS5uZXR3b3JrLm9uKCJibHVyTm9kZSIsIGZ1bmN0aW9uKHBhcmFtcyl7DQogICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaG92ZXJOZWFyZXN0ICYmIHgubm9kZXMpew0KICAgICAgICBuZWlnaGJvdXJob29kSGlnaGxpZ2h0KFtdLCAiaG92ZXIiLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0QWxnb3JpdGhtKTsNCiAgICAgIH0gICAgICANCiAgICB9KTsNCiAgICANCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAvL2NvbGxhcHNlDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgaW5zdGFuY2UubmV0d29yay5vbigiZG91YmxlQ2xpY2siLCBmdW5jdGlvbihwYXJhbXMpew0KICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmNvbGxhcHNlKXsNCiAgICAgICAgY29sbGFwc2VkTmV0d29yayhwYXJhbXMubm9kZXMsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5jb2xsYXBzZUZpdCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmNvbGxhcHNlUmVzZXRIaWdobGlnaHQsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5jbHVzdGVyT3B0aW9ucywgDQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS50cmVlLCBpbnN0YW5jZS5uZXR3b3JrLCBlbC5pZCkgDQogICAgICB9DQogICAgfSk7IA0KICAgIA0KICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5jb2xsYXBzZSl7DQogICAgICBpbnN0YW5jZS5uZXR3b3JrLm9uKCJkb3VibGVDbGljayIsIG5ldHdvcmtPcGVuQ2x1c3Rlcik7DQogICAgfQ0KICAgIA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vZm9vdGVyDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgdmFyIGRpdl9mb290ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICBkaXZfZm9vdGVyLmlkID0gImZvb3RlciIrZWwuaWQ7DQogICAgZGl2X2Zvb3Rlci5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgICdmb250LWZhbWlseTpHZW9yZ2lhLCBUaW1lcyBOZXcgUm9tYW4sIFRpbWVzLCBzZXJpZjtmb250LXNpemU6MTJweDt0ZXh0LWFsaWduOmNlbnRlcjsnKTsNCiAgICBkaXZfZm9vdGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIiArIGVsLmlkKS5hcHBlbmRDaGlsZChkaXZfZm9vdGVyKTsgIA0KICAgIGlmKHguZm9vdGVyICE9PSBudWxsKXsNCiAgICAgIGRpdl9mb290ZXIuaW5uZXJIVE1MID0geC5mb290ZXIudGV4dDsNCiAgICAgIGRpdl9mb290ZXIuc2V0QXR0cmlidXRlKCdzdHlsZScsICB4LmZvb3Rlci5zdHlsZSk7DQogICAgICBkaXZfZm9vdGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyANCiAgICB9DQogICAgDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgLy8gZXhwb3J0DQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgaWYoeC5leHBvcnQgIT09IHVuZGVmaW5lZCl7DQogICAgICANCiAgICAgIHZhciBkb3dubG9hZGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgZG93bmxvYWRkaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsICdmbG9hdDpyaWdodDsgd2lkdGg6MTAwJScpOw0KICAgICAgDQogICAgICB2YXIgZG93bmxvYWRidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsNCiAgICAgIGRvd25sb2FkYnV0dG9uLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCB4LmV4cG9ydC5jc3MpOw0KICAgICAgZG93bmxvYWRidXR0b24uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOw0KICAgICAgZG93bmxvYWRidXR0b24uaWQgPSAiZG93bmxvYWQiK2VsLmlkOw0KICAgICAgZG93bmxvYWRidXR0b24uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoeC5leHBvcnQubGFiZWwpKTsgDQogICAgICBkb3dubG9hZGRpdi5hcHBlbmRDaGlsZChkb3dubG9hZGJ1dHRvbik7DQogICAgICANCiAgICAgIHZhciBociA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImhyIik7DQogICAgICBoci5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2hlaWdodDo1cHg7IHZpc2liaWxpdHk6aGlkZGVuOyBtYXJnaW4tYm90dG9tOi0xcHg7Jyk7DQogICAgICBkb3dubG9hZGRpdi5hcHBlbmRDaGlsZChocik7ICANCiAgICAgIA0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5kaXYiK2VsLmlkKS5hcHBlbmRDaGlsZChkb3dubG9hZGRpdik7DQogICAgICANCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkb3dubG9hZCIrZWwuaWQpLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsNCg0KICAgICAgLy8gaGVpZ2h0IGNvbnRyb2wgZm9yIGV4cG9ydA0KICAgICAgdmFyIGFkZEhlaWdodEV4cG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIgKyBlbC5pZCkub2Zmc2V0SGVpZ2h0ICsgaWRMaXN0Lm9mZnNldEhlaWdodCArIGJ5TGlzdC5vZmZzZXRIZWlnaHQgKyBkb3dubG9hZGRpdi5vZmZzZXRIZWlnaHQ7DQogICAgICBpZihkaXZfdGl0bGUuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKXsNCiAgICAgICAgYWRkSGVpZ2h0RXhwb3J0ID0gYWRkSGVpZ2h0RXhwb3J0ICsgZGl2X3RpdGxlLm9mZnNldEhlaWdodDsNCiAgICAgIH0NCiAgICAgIGlmKGRpdl9zdWJ0aXRsZS5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpew0KICAgICAgICBhZGRIZWlnaHRFeHBvcnQgPSBhZGRIZWlnaHRFeHBvcnQgKyBkaXZfc3VidGl0bGUub2Zmc2V0SGVpZ2h0Ow0KICAgICAgfQ0KICAgICAgaWYoZGl2X2Zvb3Rlci5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpew0KICAgICAgICBhZGRIZWlnaHRFeHBvcnQgPSBhZGRIZWlnaHRFeHBvcnQgKyBkaXZfZm9vdGVyLm9mZnNldEhlaWdodDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGFkZEhlaWdodEV4cG9ydCA9IGFkZEhlaWdodEV4cG9ydCArIDE1Ow0KICAgICAgfQ0KDQogICAgICBkb3dubG9hZGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgaWYoeC5leHBvcnQudHlwZSAhPT0gInBkZiIpew0KICAgICAgICBodG1sMmNhbnZhcyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCksIHsNCiAgICAgICAgICBiYWNrZ3JvdW5kOiB4LmV4cG9ydC5iYWNrZ3JvdW5kLA0KICAgICAgICAgIGhlaWdodCA6IGFkZEhlaWdodEV4cG9ydCwNCiAgICAgICAgICBvbnJlbmRlcmVkOiBmdW5jdGlvbihjYW52YXMpIHsNCiAgICAgICAgICAgIGNhbnZhcy50b0Jsb2JIRChmdW5jdGlvbihibG9iKSB7DQogICAgICAgICAgICAgIHNhdmVBcyhibG9iLCB4LmV4cG9ydC5uYW1lKTsNCiAgICAgICAgICAgIH0sICJpbWFnZS8iK3guZXhwb3J0LnR5cGUpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBodG1sMmNhbnZhcyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCksIHsNCiAgICAgICAgICBiYWNrZ3JvdW5kOiB4LmV4cG9ydC5iYWNrZ3JvdW5kLA0KICAgICAgICAgIGhlaWdodCA6IGFkZEhlaWdodEV4cG9ydCwNCiAgICAgICAgICBvbnJlbmRlcmVkOiBmdW5jdGlvbihjYW52YXMpIHsNCiAgICAgICAgICAgIHZhciBteUltYWdlID0gY2FudmFzLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIiwgMS4wKTsNCiAgICAgICAgICAgIC8vdmFyIGltZ1dpZHRoID0gKGNhbnZhcy53aWR0aCAqIDI1LjQpIC8gMjQ7DQogICAgICAgICAgICAvL3ZhciBpbWdIZWlnaHQgPSAoY2FudmFzLmhlaWdodCAqIDI1LjQpIC8gMjQ7IA0KICAgICAgICAgICAgdmFyIHRhYmxlID0gbmV3IGpzUERGKCdsJywgJ3B0JywgW2NhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodF0pOw0KICAgICAgICAgICAgdGFibGUuYWRkSW1hZ2UobXlJbWFnZSwgJ0pQRUcnLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOw0KICAgICAgICAgICAgdGFibGUuc2F2ZSh4LmV4cG9ydC5uYW1lKTsNCiAgICAgICAgICB9IA0KICAgICAgICB9KTsNCiAgICAgIH0NCg0KICAgICAgZG93bmxvYWRidXR0b24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICB9Ow0KICAgIH0NCg0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vIGRhdGFNYW5pcHVsYXRpb24NCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICBmdW5jdGlvbiBjbGVhclBvcFVwKCkgew0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhdmVCdXR0b24nKS5vbmNsaWNrID0gbnVsbDsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW5jZWxCdXR0b24nKS5vbmNsaWNrID0gbnVsbDsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXR3b3JrLXBvcFVwJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzYXZlTm9kZShkYXRhLCBjYWxsYmFjaywgY21kKSB7DQogICAgICBkYXRhLmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vZGUtaWQnKS52YWx1ZTsNCiAgICAgIGRhdGEubGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm9kZS1sYWJlbCcpLnZhbHVlOw0KICAgICAgaWYgKHdpbmRvdy5TaGlueSl7DQogICAgICAgIHZhciBvYmogPSB7Y21kOiBjbWQsIGlkOiBkYXRhLmlkLCBsYWJlbDogZGF0YS5sYWJlbH0NCiAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZShlbC5pZCArICdfZ3JhcGhDaGFuZ2UnLCBvYmopOw0KICAgICAgfQ0KICAgICAgY2xlYXJQb3BVcCgpOw0KICAgICAgY2FsbGJhY2soZGF0YSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2F2ZUVkZ2UoZGF0YSwgY2FsbGJhY2ssIGNtZCkgew0KICAgICAgY2FsbGJhY2soZGF0YSk7IC8vbXVzdCBiZSBmaXJzdCBjYWxsZWQgZm9yIGVnZGUgaWQgIQ0KICAgICAgaWYgKHdpbmRvdy5TaGlueSl7DQogICAgICAgIHZhciBvYmogPSB7Y21kOiBjbWQsIGlkOiBkYXRhLmlkLCBmcm9tOiBkYXRhLmZyb20sIHRvOiBkYXRhLnRvfTsNCiAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZShlbC5pZCArICdfZ3JhcGhDaGFuZ2UnLCBvYmopOw0KICAgICAgfQ0KICAgICAgDQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGVsZXRlU3ViR3JhcGgoZGF0YSwgY2FsbGJhY2spIHsNCiAgICAgIGlmICh3aW5kb3cuU2hpbnkpew0KICAgICAgICB2YXIgb2JqID0ge2NtZDogImRlbGV0ZUVsZW1lbnRzIiwgbm9kZXM6IGRhdGEubm9kZXMsIGVkZ2VzOiBkYXRhLmVkZ2VzfQ0KICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGVsLmlkICsgJ19ncmFwaENoYW5nZScsIG9iaik7DQogICAgICB9DQogICAgICBjYWxsYmFjayhkYXRhKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYW5jZWxFZGl0KGNhbGxiYWNrKSB7DQogICAgICBjbGVhclBvcFVwKCk7DQogICAgICBjYWxsYmFjayhudWxsKTsNCiAgICB9DQogICAgDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgLy8gQ0xVU1RFUklORw0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIGlmKHguY2x1c3RlcmluZ0dyb3VwIHx8IHguY2x1c3RlcmluZ0NvbG9yIHx8IHguY2x1c3RlcmluZ0h1YnNpemUgfHwgeC5jbHVzdGVyaW5nQ29ubmVjdGlvbil7DQogICAgICANCiAgICAgIHZhciBjbHVzdGVyYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsNCiAgICAgIGNsdXN0ZXJidXR0b24uaWQgPSAiYmFja2J0biIrZWwuaWQ7DQogICAgICBjbHVzdGVyYnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTsgIA0KICAgICAgY2x1c3RlcmJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgJ1JlaW5pdGlhbGl6ZSBjbHVzdGVyaW5nJyk7IA0KICAgICAgY2x1c3RlcmJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2JhY2tncm91bmQtY29sb3I6I0ZGRkZGRjtib3JkZXI6IG5vbmUnKTsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5hcHBlbmRDaGlsZChjbHVzdGVyYnV0dG9uKTsNCiAgICAgIA0KICAgICAgY2x1c3RlcmJ1dHRvbi5vbmNsaWNrID0gIGZ1bmN0aW9uKCl7DQogICAgICAgIGluc3RhbmNlLm5ldHdvcmsuc2V0RGF0YShkYXRhKTsNCiAgICAgICAgaWYoeC5jbHVzdGVyaW5nQ29sb3Ipew0KICAgICAgICAgIGNsdXN0ZXJCeUNvbG9yKCk7DQogICAgICAgIH0NCiAgICAgICAgaWYoeC5jbHVzdGVyaW5nR3JvdXApew0KICAgICAgICAgIGNsdXN0ZXJCeUdyb3VwKCk7DQogICAgICAgIH0NCiAgICAgICAgaWYoeC5jbHVzdGVyaW5nSHVic2l6ZSl7DQogICAgICAgICAgY2x1c3RlckJ5SHVic2l6ZSgpOw0KICAgICAgICB9DQogICAgICAgIGlmKHguY2x1c3RlcmluZ0Nvbm5lY3Rpb24pew0KICAgICAgICAgIGNsdXN0ZXJCeUNvbm5lY3Rpb24oKTsNCiAgICAgICAgfQ0KICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLmZpdCgpOw0KICAgICAgfQ0KICAgIH0NCiAgICANCiAgICBpZih4LmNsdXN0ZXJpbmdHcm91cCB8fCB4LmNsdXN0ZXJpbmdDb2xvciB8fCB4LmNsdXN0ZXJpbmdPdXRsaWVycyB8fCB4LmNsdXN0ZXJpbmdIdWJzaXplIHx8IHguY2x1c3RlcmluZ0Nvbm5lY3Rpb24pew0KICAgICAgLy8gaWYgd2UgY2xpY2sgb24gYSBub2RlLCB3ZSB3YW50IHRvIG9wZW4gaXQgdXAhDQogICAgICBpbnN0YW5jZS5uZXR3b3JrLm9uKCJkb3VibGVDbGljayIsIGZ1bmN0aW9uIChwYXJhbXMpew0KICAgICAgICBpZiAocGFyYW1zLm5vZGVzLmxlbmd0aCA9PT0gMSkgew0KICAgICAgICAgIGlmIChpbnN0YW5jZS5uZXR3b3JrLmlzQ2x1c3RlcihwYXJhbXMubm9kZXNbMF0pID09PSB0cnVlKSB7DQogICAgICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLm9wZW5DbHVzdGVyKHBhcmFtcy5ub2Rlc1swXSwge3JlbGVhc2VGdW5jdGlvbiA6IGZ1bmN0aW9uKGNsdXN0ZXJQb3NpdGlvbiwgY29udGFpbmVkTm9kZXNQb3NpdGlvbnMpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lZE5vZGVzUG9zaXRpb25zOw0KICAgICAgICAgICAgfX0pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgfQ0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vY2x1c3RlcmluZyBDb25uZWN0aW9uDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgaWYoeC5jbHVzdGVyaW5nQ29ubmVjdGlvbil7DQogICAgICANCiAgICAgIGZ1bmN0aW9uIGNsdXN0ZXJCeUNvbm5lY3Rpb24oKSB7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5jbHVzdGVyaW5nQ29ubmVjdGlvbi5ub2Rlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIGluc3RhbmNlLm5ldHdvcmsuY2x1c3RlckJ5Q29ubmVjdGlvbih4LmNsdXN0ZXJpbmdDb25uZWN0aW9uLm5vZGVzW2ldKQ0KICAgICAgICB9DQogICAgICB9DQogICAgICBjbHVzdGVyQnlDb25uZWN0aW9uKCk7DQogICAgfQ0KICAgIA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vY2x1c3RlcmluZyBodWJzaXplDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgaWYoeC5jbHVzdGVyaW5nSHVic2l6ZSl7DQogICAgICANCiAgICAgIGZ1bmN0aW9uIGNsdXN0ZXJCeUh1YnNpemUoKSB7DQogICAgICAgIHZhciBjbHVzdGVyT3B0aW9uc0J5RGF0YSA9IHsNCiAgICAgICAgICBwcm9jZXNzUHJvcGVydGllczogZnVuY3Rpb24oY2x1c3Rlck9wdGlvbnMsIGNoaWxkTm9kZXMpIHsNCiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgIC8vdG90YWxNYXNzICs9IGNoaWxkTm9kZXNbaV0ubWFzczsNCiAgICAgICAgICAgICAgICAgICAgICBpZihpID09PSAwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2x1c3Rlck9wdGlvbnMuc2hhcGUgPSAgY2hpbGROb2Rlc1tpXS5zaGFwZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLmNvbG9yID0gIGNoaWxkTm9kZXNbaV0uY29sb3IuYmFja2dyb3VuZDsNCiAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoY2hpbGROb2Rlc1tpXS5zaGFwZSAhPT0gY2x1c3Rlck9wdGlvbnMuc2hhcGUpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NsdXN0ZXJPcHRpb25zLnNoYXBlID0gJ2RhdGFiYXNlJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGROb2Rlc1tpXS5jb2xvci5iYWNrZ3JvdW5kICE9PSBjbHVzdGVyT3B0aW9ucy5jb2xvcil7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLmNvbG9yID0gJ2dyZXknOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLmxhYmVsID0gIlsiICsgY2hpbGROb2Rlcy5sZW5ndGggKyAiXSI7DQogICAgICAgICAgICByZXR1cm4gY2x1c3Rlck9wdGlvbnM7DQogICAgICAgICAgfSwNCiAgICAgICAgICBjbHVzdGVyTm9kZVByb3BlcnRpZXM6IHtib3JkZXJXaWR0aDozLCBzaGFwZTonYm94JywgZm9udDp7c2l6ZTozMH19DQogICAgICAgIH0NCiAgICAgICAgaWYoeC5jbHVzdGVyaW5nSHVic2l6ZS5zaXplID4gMCl7DQogICAgICAgICAgaW5zdGFuY2UubmV0d29yay5jbHVzdGVyQnlIdWJzaXplKHguY2x1c3RlcmluZ0h1YnNpemUuc2l6ZSwgY2x1c3Rlck9wdGlvbnNCeURhdGEpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLmNsdXN0ZXJCeUh1YnNpemUodW5kZWZpbmVkLCBjbHVzdGVyT3B0aW9uc0J5RGF0YSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIA0KICAgICAgY2x1c3RlckJ5SHVic2l6ZSgpOw0KICAgIH0NCiAgICANCiAgICBpZih4LmNsdXN0ZXJpbmdDb2xvcil7DQogICAgICANCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAvL2NsdXN0ZXJpbmcgY29sb3INCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICBmdW5jdGlvbiBjbHVzdGVyQnlDb2xvcigpIHsNCiAgICAgICAgdmFyIGNvbG9ycyA9IHguY2x1c3RlcmluZ0NvbG9yLmNvbG9ycw0KICAgICAgICB2YXIgY2x1c3Rlck9wdGlvbnNCeURhdGE7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgdmFyIGNvbG9yID0gY29sb3JzW2ldOw0KICAgICAgICAgIGNsdXN0ZXJPcHRpb25zQnlEYXRhID0gew0KICAgICAgICAgICAgICBqb2luQ29uZGl0aW9uOiBmdW5jdGlvbiAoY2hpbGRPcHRpb25zKSB7DQogICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRPcHRpb25zLmNvbG9yLmJhY2tncm91bmQgPT0gY29sb3I7IC8vIHRoZSBjb2xvciBpcyBmdWxseSBkZWZpbmVkIGluIHRoZSBub2RlLg0KICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICBwcm9jZXNzUHJvcGVydGllczogZnVuY3Rpb24gKGNsdXN0ZXJPcHRpb25zLCBjaGlsZE5vZGVzLCBjaGlsZEVkZ2VzKSB7DQogICAgICAgICAgICAgICAgICB2YXIgdG90YWxNYXNzID0gMDsNCiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTWFzcyArPSBjaGlsZE5vZGVzW2ldLm1hc3M7DQogICAgICAgICAgICAgICAgICAgICAgaWYoeC5jbHVzdGVyaW5nQ29sb3IuZm9yY2UgPT09IGZhbHNlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgPT09IDApew0KICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy5zaGFwZSA9ICBjaGlsZE5vZGVzW2ldLnNoYXBlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkTm9kZXNbaV0uc2hhcGUgIT09IGNsdXN0ZXJPcHRpb25zLnNoYXBlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy5zaGFwZSA9IHguY2x1c3RlcmluZ0NvbG9yLnNoYXBlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLnNoYXBlID0geC5jbHVzdGVyaW5nQ29sb3Iuc2hhcGU7DQogICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy52YWx1ZSA9IHRvdGFsTWFzczsNCiAgICAgICAgICAgICAgICAgIHJldHVybiBjbHVzdGVyT3B0aW9uczsNCiAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgY2x1c3Rlck5vZGVQcm9wZXJ0aWVzOiB7aWQ6ICdjbHVzdGVyOicgKyBjb2xvciwgYm9yZGVyV2lkdGg6IDMsIGNvbG9yOmNvbG9yLCBsYWJlbDogeC5jbHVzdGVyaW5nQ29sb3IubGFiZWwgKyBjb2xvcn0NCiAgICAgICAgICB9DQogICAgICAgICAgaW5zdGFuY2UubmV0d29yay5jbHVzdGVyKGNsdXN0ZXJPcHRpb25zQnlEYXRhKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgDQogICAgICBjbHVzdGVyQnlDb2xvcigpOw0KICAgIH0NCg0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vY2x1c3RlcmluZyBncm91cHMNCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICBpZih4LmNsdXN0ZXJpbmdHcm91cCl7DQogICAgICANCiAgICAgIGZ1bmN0aW9uIGNsdXN0ZXJCeUdyb3VwKCkgew0KICAgICAgICB2YXIgZ3JvdXBzID0geC5jbHVzdGVyaW5nR3JvdXAuZ3JvdXBzOw0KICAgICAgICB2YXIgY2x1c3Rlck9wdGlvbnNCeURhdGE7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgdmFyIGdyb3VwID0gZ3JvdXBzW2ldOw0KICAgICAgICAgIGNsdXN0ZXJPcHRpb25zQnlEYXRhID0gew0KICAgICAgICAgICAgICBqb2luQ29uZGl0aW9uOiBmdW5jdGlvbiAoY2hpbGRPcHRpb25zKSB7DQogICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRPcHRpb25zLmdyb3VwID09IGdyb3VwOyAvLw0KICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICBwcm9jZXNzUHJvcGVydGllczogZnVuY3Rpb24gKGNsdXN0ZXJPcHRpb25zLCBjaGlsZE5vZGVzLCBjaGlsZEVkZ2VzKSB7DQogICAgICAgICAgICAgICAgLy9jb25zb2xlLmluZm8oY2x1c3Rlck9wdGlvbnMpOw0KICAgICAgICAgICAgICAgICAgdmFyIHRvdGFsTWFzcyA9IDA7DQogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICB0b3RhbE1hc3MgKz0gY2hpbGROb2Rlc1tpXS5tYXNzOw0KICAgICAgICAgICAgICAgICAgICAgIGlmKHguY2x1c3RlcmluZ0dyb3VwLmZvcmNlID09PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihpID09PSAwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMuc2hhcGUgPSAgY2hpbGROb2Rlc1tpXS5zaGFwZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMuY29sb3IgPSAgY2hpbGROb2Rlc1tpXS5jb2xvci5iYWNrZ3JvdW5kOw0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkTm9kZXNbaV0uc2hhcGUgIT09IGNsdXN0ZXJPcHRpb25zLnNoYXBlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy5zaGFwZSA9IHguY2x1c3RlcmluZ0dyb3VwLnNoYXBlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkTm9kZXNbaV0uY29sb3IuYmFja2dyb3VuZCAhPT0gY2x1c3Rlck9wdGlvbnMuY29sb3Ipew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLmNvbG9yID0geC5jbHVzdGVyaW5nR3JvdXAuY29sb3I7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMuc2hhcGUgPSB4LmNsdXN0ZXJpbmdHcm91cC5zaGFwZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLmNvbG9yID0geC5jbHVzdGVyaW5nR3JvdXAuY29sb3I7DQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMudmFsdWUgPSB0b3RhbE1hc3M7DQogICAgICAgICAgICAgICAgICByZXR1cm4gY2x1c3Rlck9wdGlvbnM7DQogICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgIGNsdXN0ZXJOb2RlUHJvcGVydGllczoge2lkOiAnY2x1c3RlcjonICsgZ3JvdXAsIGJvcmRlcldpZHRoOiAzLCBsYWJlbDp4LmNsdXN0ZXJpbmdHcm91cC5sYWJlbCArIGdyb3VwfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLmNsdXN0ZXIoY2x1c3Rlck9wdGlvbnNCeURhdGEpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBjbHVzdGVyQnlHcm91cCgpOw0KICAgIH0NCiAgDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgLy9jbHVzdGVyaW5nIGJ5IHpvb20NCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICBpZih4LmNsdXN0ZXJpbmdPdXRsaWVycyl7DQogICAgICANCiAgICAgIGNsdXN0ZXJGYWN0b3IgPSB4LmNsdXN0ZXJpbmdPdXRsaWVycy5jbHVzdGVyRmFjdG9yOw0KICAgICAgDQogICAgICAvLyBzZXQgdGhlIGZpcnN0IGluaXRpYWwgem9vbSBsZXZlbA0KICAgICAgaW5zdGFuY2UubmV0d29yay5vbignaW5pdFJlZHJhdycsIGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAobGFzdENsdXN0ZXJab29tTGV2ZWwgPT09IDApIHsNCiAgICAgICAgICBsYXN0Q2x1c3Rlclpvb21MZXZlbCA9IGluc3RhbmNlLm5ldHdvcmsuZ2V0U2NhbGUoKTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQoNCiAgICAgIC8vIHdlIHVzZSB0aGUgem9vbSBldmVudCBmb3Igb3VyIGNsdXN0ZXJpbmcNCiAgICAgIGluc3RhbmNlLm5ldHdvcmsub24oJ3pvb20nLCBmdW5jdGlvbiAocGFyYW1zKSB7DQogICAgICAgIGlmKGN0cmx3YWl0ID09PSAwKXsNCiAgICAgICAgaWYgKHBhcmFtcy5kaXJlY3Rpb24gPT0gJy0nKSB7DQogICAgICAgICAgaWYgKHBhcmFtcy5zY2FsZSA8IGxhc3RDbHVzdGVyWm9vbUxldmVsKmNsdXN0ZXJGYWN0b3IpIHsNCiAgICAgICAgICAgIG1ha2VDbHVzdGVycyhwYXJhbXMuc2NhbGUpOw0KICAgICAgICAgICAgbGFzdENsdXN0ZXJab29tTGV2ZWwgPSBwYXJhbXMuc2NhbGU7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgIG9wZW5DbHVzdGVycyhwYXJhbXMuc2NhbGUpOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0NCg0KICAgIC8vIG1ha2UgdGhlIGNsdXN0ZXJzDQogICAgZnVuY3Rpb24gbWFrZUNsdXN0ZXJzKHNjYWxlKSB7DQogICAgICAgIGN0cmx3YWl0ID0gMTsNCiAgICAgICAgdmFyIGNsdXN0ZXJPcHRpb25zQnlEYXRhID0gew0KICAgICAgICAgICAgcHJvY2Vzc1Byb3BlcnRpZXM6IGZ1bmN0aW9uIChjbHVzdGVyT3B0aW9ucywgY2hpbGROb2Rlcykgew0KICAgICAgICAgICAgICAgIGNsdXN0ZXJJbmRleCA9IGNsdXN0ZXJJbmRleCArIDE7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuQ291bnQgPSAwOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbkNvdW50ICs9IGNoaWxkTm9kZXNbaV0uY2hpbGRyZW5Db3VudCB8fCAxOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy5jaGlsZHJlbkNvdW50ID0gY2hpbGRyZW5Db3VudDsNCiAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy5sYWJlbCA9ICIjICIgKyBjaGlsZHJlbkNvdW50ICsgIiI7DQogICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMuZm9udCA9IHtzaXplOiBjaGlsZHJlbkNvdW50KjUrMzB9DQogICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMuaWQgPSAnY2x1c3RlcjonICsgY2x1c3RlckluZGV4Ow0KICAgICAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2goe2lkOidjbHVzdGVyOicgKyBjbHVzdGVySW5kZXgsIHNjYWxlOnNjYWxlfSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGNsdXN0ZXJPcHRpb25zOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGNsdXN0ZXJOb2RlUHJvcGVydGllczoge2JvcmRlcldpZHRoOiAzLCBzaGFwZTogJ2RhdGFiYXNlJywgZm9udDoge3NpemU6IDMwfX0NCiAgICAgICAgfQ0KICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLmNsdXN0ZXJPdXRsaWVycyhjbHVzdGVyT3B0aW9uc0J5RGF0YSk7DQogICAgICAgIGlmICh4LmNsdXN0ZXJpbmdPdXRsaWVycy5zdGFiaWxpemUpIHsNCiAgICAgICAgICAgIGluc3RhbmNlLm5ldHdvcmsuc3RhYmlsaXplKCk7DQogICAgICAgIH07DQogICAgICAgIGN0cmx3YWl0ID0gMDsNCiAgICB9DQoNCiAgICAvLyBvcGVuIHRoZW0gYmFjayB1cCENCiAgICBmdW5jdGlvbiBvcGVuQ2x1c3RlcnMoc2NhbGUpIHsNCiAgICAgICAgY3RybHdhaXQgPSAxOw0KICAgICAgICB2YXIgbmV3Q2x1c3RlcnMgPSBbXTsNCiAgICAgICAgdmFyIGRlY2x1c3RlcmVkID0gZmFsc2U7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChjbHVzdGVyc1tpXS5zY2FsZSA8IHNjYWxlKSB7DQogICAgICAgICAgICAgICAgaW5zdGFuY2UubmV0d29yay5vcGVuQ2x1c3RlcihjbHVzdGVyc1tpXS5pZCk7DQogICAgICAgICAgICAgICAgbGFzdENsdXN0ZXJab29tTGV2ZWwgPSBzY2FsZTsNCiAgICAgICAgICAgICAgICBkZWNsdXN0ZXJlZCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBuZXdDbHVzdGVycy5wdXNoKGNsdXN0ZXJzW2ldKQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGNsdXN0ZXJzID0gbmV3Q2x1c3RlcnM7DQogICAgICAgIGlmICh4LmNsdXN0ZXJpbmdPdXRsaWVycy5zdGFiaWxpemUpIHsNCiAgICAgICAgICAgIGluc3RhbmNlLm5ldHdvcmsuc3RhYmlsaXplKCk7DQogICAgICAgIH07DQogICAgICAgIGN0cmx3YWl0ID0gMDsNCiAgICB9DQogICAgDQogICAgLy8qKioqKioqKioqKioqKioqKioNCiAgICAvLyBpbml0IHNlbGVjdGlvbg0KICAgIC8vKioqKioqKioqKioqKioqKioqDQogICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmlkc2VsZWN0aW9uICYmIHgubm9kZXMgJiYgeC5pZHNlbGVjdGlvbi5zZWxlY3RlZCAhPT0gdW5kZWZpbmVkKXsgDQogICAgICBvbklkQ2hhbmdlKCcnKyB4Lmlkc2VsZWN0aW9uLnNlbGVjdGVkLCB0cnVlKTsNCiAgICB9DQogICAgICANCiAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb24gJiYgeC5ub2RlcyAmJiB4LmJ5c2VsZWN0aW9uLnNlbGVjdGVkICE9PSB1bmRlZmluZWQpeyANCiAgICAgIG9uQnlDaGFuZ2UoeC5ieXNlbGVjdGlvbi5zZWxlY3RlZCk7DQogICAgICBzZWxlY3ROb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbGVjdGVkQnknK2VsLmlkKTsNCiAgICAgIHNlbGVjdE5vZGUudmFsdWUgPSB4LmJ5c2VsZWN0aW9uLnNlbGVjdGVkOw0KICAgIH0NCiAgICANCiAgICAvLyB0cnkgdG8gZml4IGljb25zIGxvYWRpbmcgY3NzIGJ1Zy4uLg0KICAgIGZ1bmN0aW9uIGljb25zUmVkcmF3KCkgew0KICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICBpZihpbnN0YW5jZS5uZXR3b3JrKQ0KICAgICAgICAgIGluc3RhbmNlLm5ldHdvcmsucmVkcmF3KCk7DQogICAgICAgIGlmKGluc3RhbmNlLmxlZ2VuZCkNCiAgICAgICAgICBpbnN0YW5jZS5sZWdlbmQucmVkcmF3KCk7DQogICAgICB9LCAyMDApOw0KICAgIH0NCiAgICBpZih4Lmljb25zUmVkcmF3ICE9PSB1bmRlZmluZWQpew0KICAgICAgaWYoeC5pY29uc1JlZHJhdyl7DQogICAgICAgIGluc3RhbmNlLm5ldHdvcmsub25jZSgic3RhYmlsaXplZCIsIGZ1bmN0aW9uKCl7aWNvbnNSZWRyYXcoKTt9KQ0KICAgICAgfQ0KICAgIH0NCiAgfSwgDQogIA0KICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBpbnN0YW5jZSkgew0KICAgICAgaWYoaW5zdGFuY2UubmV0d29yaykNCiAgICAgICAgaW5zdGFuY2UubmV0d29yay5maXQoKTsNCiAgICAgIGlmKGluc3RhbmNlLmxlZ2VuZCkNCiAgICAgICAgaW5zdGFuY2UubGVnZW5kLmZpdCgpOw0KICB9DQogIA0KfSk7DQo="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-01d94975dbdb944cbaa3" class="visNetwork html-widget" style="width:1024px;height:768px;">

</div>
</div>
<script type="application/json" data-for="htmlwidget-01d94975dbdb944cbaa3">{"x":{"nodes":{"id":[5,12,18,19,23,34,45,58,70,72,73,91,92,93,94,95,97,111,123,137,147,149,157,159,167,168,170,175,178,179,182,190,191,193,198,201,202,208,222,225,233,235,237,242,247,253,261,262,265,275,280,285,287,289,290,291,294,295,298,299,300,301,303,308,310,313,316,320,321,324,326,329,332,336,342,346,351,352,354,355,376,377,378,386,394,396,404,406,409,410,416,424,434,440,445,447,455,464,470,473,477,478,479,485,489,491,495,498,503,507,511,515,516,518,528,532,538,540,542,545,547,550,551,553,562,567,569,577,579,586,592,594,601,607,612,632,633,638,648,662,673,676,690,694,698,701,704,711,713,714,715,716,717,719,723,726,728,729,732,737,742,743,744,748,759,762,766,767,768,772,777,787,793,799,802,804,806,807,817,820,822,823,828,830,831,845,851,854,855,857,865,872,876,877,878,879,880,884,886,895,901,902,905,911,917,920,921,925,930,933,938,940,945,958,964,969,972,977,982,990,996,1003,1016,1018,1021,1031,1045,1051,1056,1059,1060,1063,1070,1073,1074,1076,1078,1085,1093,1097,1099,1114,1116,1122,1123,1128,1138,1141,1142,1148,1154,1158,1162,1164,1165,1167,1174,1177,1181,1188,1193,1196,1200,1201,1209,1211,1212,1223,1232,1233,1235,1240,1242,1250,1251,1252,1256,1257,1259,1266,1268,1271,1273,1279,1281,1282,1287,1290,1303,1310,1311,1313,1317,1322,1329,1333,1337,1338,1348,1368,1375,1379,1386,1387,1388,1392,1395,1407,1409,1417,1420,1421,1424,1438,1449,1450,1453,1455,1463,1465,1468,1471,1481,1488,1492,1493,1497,1499,1500,1504,1505,1508,1521,1524,1528,1529,1534,1535,1536,1538,1543,1544,1545,1548,1549,1560,1562,1569,1571,1572,1574,1575,1578,1585,1586,1597,1598,1616,1619,1628,1639,1643,1644,1650,1654,1655,1656,1657,1661,1662,1665,1670,1674,1677,1688,1694,1707,1715,1720,1729,1730,1734,1736,1745,1747,1754,1756,1757,1758,1760,1761,1765,1769,1772,1777,1778,1779,1785,1787,1789,1798,1801,1804,1807,1811,1817,1819,1820,1822,1825,1833,1834,1836,1841,1845,1846,1848,1858,1859,1872,1878,1886,1890,1893,1909,1916,1918,1925,1936,1937,1939,1944,1945,1948,1954,1971,1975,1996,2002,2004,2006,2011,2015,2019,2023,2024,2042,2043,2045,2046,2051,2059,2065,2069,2078,2083,2085,2086,2088,2090,2091,2099,2105,2108,2113,2114,2116,2119,2124,2129,2130,2139,2140,2141,2144,2155,2159,2160,2164,2174,2179,2182,2194,2196,2198,2199,2202,2206,2215,2228,2243,2246,2250,2252,2255,2256,2258,2260,2262,2267,2270,2278,2282,2285,2299,2303,2304,2305,2308,2309,2315,2317,2326,2336,2341,2359,2363,2369,2370,2375,2376,2377,2379,2382,2385,2411,2418,2422,2423,2424,2426,2432,2445,2446,2452,2456,2468,2471,2472,2473,2476,2481,2502,2509,2516,2517,2519,2523,2525,2538,2539,2542,2543,2544,2549,2553,2556,2559,2572,2579,2585,2587,2594,2597,2605,2608,2614,2615,2617,2618,2619,2620,2624,2627,2630,2634,2638,2640,2645,2648,2651,2653,2655,2656,2662,2666,2674,2677,2683,2691,2692,2694,2699,2700,2702,2703,2704,2711,2712,2726,2733,2741,2744,2748,2749,2760,2771,2774,2781,2785,2786,2787,2794,2799,2803,2810,2811,2817,2822,2824,2826,2840,2847,2849,2850,2863,2872,2875,2921],"title":["acerbi, a","adger, d","aguilar, e","ahmed, h","al-shawaf, l","allen, j","amati, v","andre, j","aoki, k","apperly, i","arak, a","atkinson, m","atkinson, q","atkisson, c","atran, s","attwell, l","aunger, r","baimel, a","balbo, a","baral, s","baronchelli, a","barr, d","barton, m","baum, w","bebbington, k","beck, s","beckner, c","beheim, b","belinsky, k","bell, a","belpaeme, t","bentley, r","bentz, c","bergen, b","bernard, c","bettinger, r","beugin, m","biglan, a","blanchet, s","blasi, d","blust, r","blythe, r","boesch, c","bolus, m","borenstein, e","botero, c","bowler, m","bowles, s","boyd, r","brantingham, p","brennan, r","brewer, j","brighton, h","brock, w","broesch, j","bromham, l","brookes, s","brooks, j","brown, g","brown, m","brown, r","bruce, m","bruno, j","bryant, d","buchanan, b","buenstorf, g","bulbulia, j","bunce, j","burdett, e","burgess, v","burkart, j","burton-chellew, m","buss, d","byers, b","cacault, m","caiado, c","caldwell, c","call, j","calude, a","calvet, l","carpenter, m","carr, j","carr, k","castellano, c","cavalli-sforza, l","centola, d","champagne, f","chang, l","charmantier, a","chater, n","chen, b","chen, k","chiaroni, j","choi, s","christiansen, m","chudek, m","claidiere, n","cochrane, g","cohen, e","colaiori, f","collard, m","colledge, s","colleran, h","conard, n","conley, d","conroy-beam, d","cordes, c","cornish, h","cosgrove, r","coultas, j","cownden, d","creanza, n","crema, e","croft, w","culbertson, j","cunningham, s","currie, t","curtis, v","cuskley, c","da silva, s","dale, r","damerius, l","danchin, e","danielson, p","davis, s","de barra, m","de boer, b","de oliveira, e","de ruiter, j","dean, l","degano, i","delagnes, a","delgado, t","demps, k","derex, m","dickins, b","dickins, t","dingemanse, m","doelman, t","dowman, m","duenez-guzman, e","dunn, m","edinborough, k","edsten, e","efferson, c","ehrlich, p","el mouden, c","ellison, t","ember, c","ember, m","embry, d","enfield, n","enquist, m","envall, i","eren, m","ericksen, k","eriksson, g","eriksson, k","eryilmaz, k","ettlinger, m","evans, n","eve, r","everett, c","fagot, j","faulkner, j","fay, n","feeney, k","feher, o","fehr, e","feldman, m","feron, r","fimiarz, d","fischbacher, u","fitzpatrick, t","flinn, m","flynn, e","fogarty, l","foglia, m","fornander, e","forss, s","fort, j","fortunato, l","francois, p","franz, m","fraser, g","funcke, a","gachter, s","gaissmaier, w","galantucci, b","galbarczyk, a","gampe, a","garcia, claude","gardner, b","garland, e","garnett, p","garofoli, d","garrod, s","gavin, m","gavrilets, s","gelfand, m","gervais, m","gervais, w","ghirlanda, s","gibson, m","gilpin, w","gintis, h","giraldeau, l","glasauer, s","glowacki, l","godelle, b","goff, s","goldizen, a","gomez-baggethun, e","goodall, j","gowdy, j","gravino, p","gray, r","greenhill, s","griffiths, t","grote, m","gueze, m","gullstrand, j","hadley, c","hahn, m","haidle, m","hamilton, m","hartberg, y","hasegawa, t","haun, d","hawkins, j","hay, j","hayes, s","heggarty, p","henrich, j","henrich, n","henshilwood, c","hernandez, d","herzog, h","hill, k","hillis, v","hinde, r","holden, c","holmes, c","hopper, l","hoppitt, w","houkes, w","hruschka, d","hua, x","huanca, t","huber, b","huguet, p","humle, t","hunt, g","hurford, j","hurtado, a","hutchison, j","ickes, w","ihara, y","ince, s","isaksson, s","jaarsma, s","jackson, j. c.","jacquet, j","jacquet, p","janssen, m","jansson, f","jasienska, g","jobling, r","jonker, p","jordan, f","jordan, p","joyas campino, p","juda, m","kalish, m","kamilar, j","kandler, a","kanstrup, m","kanwal, j","kaplan, f","kashima, y","katsnelson, e","kawasaki, k","kay, a","kempe, m","kendal, j","kendal, r","kerig, t","kershenbaum, a","kim, u","kirby, k","kirby, s","kirkpatrick, l","kistler, d","kline, m","kobayashi, y","koese, b","kolk, m","kolodny, o","kovarovic, k","kruger, a","kupferberg, a","lachlan, r","lake, m","laland, k","lalive, r","lambeth, s","lampos, v","larsen, r","larson, g","laurin, k","lawson, d","layton, r","lea, s","lehmann, l","leonard, r","leonard, w","leris, i","lesourd, m","levin, s","levinson, s","lewandowsky, s","lewis, d","li, tong","liden, k","lilley, m","lillicrap, t","lind, j","lindenfors, p","linderholm, a","lipkind, d","lipo, c","little, h","ljubicic, i","lombard, m","loreto, v","lotem, a","lu, h","lubell, m","lucas, a","lucejko, j","lun, j","lundberg, p","lupyan, g","lycett, s","lyman, r","macdonald, i","mace, r","macleod, c","macri, m","madella, m","madison, g","madsen, m","magid, k","mak, m","makowsky, m","manning, j","manning, k","marshall-pescini, s","martin, douglas","marzouki, y","mathew, s","matthews, c","matthews, l","mccabe, c","mcdade, t","mceireath, r","mcelligott, a","mcelreath, r","mcgrew, w","mcguigan, n","mckay, r","mcnamara, r","meade, a","meeus, m","mercier, h","mesoudi, a","millen, a","misyak, j","miura, c","molina, j","molleman, l","monaghan, p","monechi, b","morgan, t","morin, o","moussaid, m","moya, c","mufwene, s","mulder, m","mullins, d","mullon, c","munson, j","murray, k","muthukrishna, m","nakahashi, w","nakajima, a","nakamaru, m","nau, d","navarrete, a","navarro, j","nenko, i","nettle, d","newson, l","nicholls, j","nicholson, n","nishida, t","noad, m","noguchi, t","nolfi, s","norenzayan, a","nowell, a","nowicki, s","nunn, c","obrien, m","odling-smee, j","odwyer, j","ohtsuki, h","olofsson, hanna","olofsson, helen","ormerod, p","osiurak, f","oudeyer, p","paciotti, b","pagel, m","parisi, d","parkington, j","parkvall, m","pastor-satorras, r","pemberton, t","pen, i","pendry, c","pepper, g","perc, m","peregrine, p","perreault, c","pierrehumbert, j","pike, t","poggenpoel, c","pollarolo, l","poole, m","poplack, s","porraz, g","postmes, t","powell, a","powers, s","pradhan, g","pugliese, m","puglisi, a","pujol, b","puleston, c","putland, d","quinones, a","rafferty, a","ramachandran, s","rasilo, h","ratner, h","ravignani, a","rawlings, b","raymond, m","reader, s","reali, f","reindl, e","rendell, l","renner, e","reyes-garcia, v","reynaud, e","reynolds, v","richerson, p","riede, f","rieucau, g","rigaud, j","roberts, g","roberts, l","roberts, s","robertson, s","roebroeks, w","rogers, d","rogers, s","roos, p","rosenberg, n","ross, c","ross, r","rubio-campillo, x","ruck, d","ruhlen, m","ruiz-mallen, i","russell, e","ruttle, a","salali, g","sandberg, m","sarkol, v","saslis-lagoudakis, c","saus, j","savolainen, v","scelza, b","schaller, m","schapiro, s","schick, a","schillinger, k","schoultz, p","schroeder, k","schwesinger, g","scott-phillips, t","sear, r","senveli, z","serpell, j","servedio, m","servedio, v","sforza, l","shackelford, t","shariff, a","shaver, j","shennan, s","shigesada, n","shulman, b","sindi, s","singh, m","sjostrand, j","skarabela, b","slater, p","slessor, g","slingerland, e","smaldino, p","smith, a","smith, k","soriano, s","souza, a","sperber, d","spike, m","spisak, b","spoor, w","stadler, k","steele, j","steels, l","stephens, p","stevens, n","strasser, a","street, s","strimling, p","stringer, c","stubbersfield, j","sugiyama, y","swoboda, n","ta, v","tamariz, m","tamura, k","tan, r","tanaka, masayuki","tanner, s","tchernichovski, o","tehrani, j","ten cate, c","tennie, c","ter haar, s","texier, p","thigpen, c","thomas, m","thompson, b","timpson, a","toelch, u","tomasello, m","tomblin, j","torreira, f","towner, m","tria, f","trouche, e","tuladhar-douglas, w","tuljapurkar, s","turchin, p","turner, c","turner, e","tutin, c","uller, t","underhill, p","urquhart, j","vaesen, k","vale, g","valone, t","van den berg, p","van der ham, s","van heijningen, c","van leeuwen, e","van schaik, c","van vugt, m","vasilescu, v","venti, j","verhoef, t","verzijden, m","villa, p","vogt, s","von cramon-taubadel, n","vose, m","wachtmeister, c","wadley, l","wagner, r","wakano, j","walker, r","walter, v","walters, c","wang, yan","waring, t","watson, m","watts, j","webley, p","webster, m","weissing, f","west, s","whalen, a","white, cindel","whitehead, h","whitehouse, h","whiten, a","wilder, b","willard, a","wilson, d","winterhalder, b","winters, j","wonnacott, e","worden, l","wrangham, r","wu, bao pei","xu, j","yahosseini, k","yamaguchi, s","yamamoto, s","yeaman, s","yuki, m","zaid, n","zorondo-rodriguez, f"],"group":[1,1,2,2,6,5,1,1,5,1,2,3,4,1,2,1,2,2,2,4,3,3,1,2,3,1,3,2,3,2,3,3,3,3,7,2,2,4,1,3,4,3,1,1,1,4,1,2,2,3,4,4,3,1,2,4,1,2,1,5,1,1,3,4,1,2,4,2,1,1,5,1,6,3,2,1,3,1,4,2,1,3,1,3,5,3,1,6,1,3,6,3,5,4,3,2,1,1,4,3,1,2,4,1,3,6,2,3,1,2,2,5,2,3,3,3,4,2,3,1,3,5,1,1,1,2,3,1,4,1,1,1,3,2,2,1,1,3,1,3,4,4,2,2,2,5,1,3,4,4,4,3,2,2,1,2,2,2,3,3,4,3,3,1,2,3,4,3,2,5,2,3,2,4,1,1,5,5,2,5,2,3,4,1,4,2,2,3,3,4,1,2,4,5,3,1,3,4,4,4,4,2,2,1,5,2,1,5,1,2,2,5,2,1,2,3,4,4,3,2,2,1,2,3,1,1,4,4,1,4,3,4,3,2,2,1,2,3,1,2,1,4,2,1,1,1,3,4,2,1,1,1,4,3,1,3,6,5,7,2,7,4,2,1,2,2,4,1,7,1,2,2,2,3,4,3,2,3,3,4,5,5,2,1,1,1,2,5,4,4,3,6,2,2,5,7,2,5,1,1,5,7,2,1,2,1,3,6,1,2,1,1,2,5,1,2,1,1,5,4,3,6,6,2,5,2,2,2,2,3,3,3,3,1,3,5,6,2,1,1,4,2,3,1,1,4,4,3,1,2,3,3,1,6,2,4,2,1,3,1,3,3,1,1,2,2,1,2,1,1,4,2,4,1,1,1,3,3,5,2,1,3,3,2,1,3,3,3,2,4,5,1,6,2,5,5,2,4,1,1,4,1,2,5,1,1,5,3,1,2,1,7,1,1,1,3,5,2,7,3,1,3,2,4,1,1,2,3,5,1,4,1,2,4,3,3,1,1,1,5,3,1,2,2,5,5,3,3,1,2,5,1,3,5,3,1,3,1,2,1,3,1,5,3,2,1,1,2,3,1,1,3,3,3,1,1,5,3,4,5,2,4,2,3,5,2,6,1,2,2,1,4,2,4,3,2,1,5,1,2,1,2,1,1,6,3,7,3,5,6,2,4,2,5,2,3,1,2,3,7,3,2,2,3,3,1,6,1,3,1,7,3,3,3,1,2,5,1,2,1,1,1,3,6,3,5,3,1,2,3,1,7,1,7,1,2,2,3,2,1,1,3,3,2,3,1,4,2,4,1,4,1,1,5,3,1,1,1,1,3,7,1,5,1,2,2,3,7,1,2,1,4,2,1,1,5,1,1,1,6,2,4,4,2,1,1,1,3,2,5,4,1,3,2,4,2,3,3,5,1,6,3,3,4,1,5,4,2,2],"value":[17,1,1,1,1,1,1,3,8,1,1,1,9,1,1,1,1,2,1,1,5,1,1,3,1,1,1,2,1,3,1,15,1,1,1,2,1,1,1,2,1,2,2,1,1,1,2,2,21,1,1,2,5,1,2,1,1,1,1,1,1,2,1,1,5,1,3,1,1,1,2,1,4,1,1,1,9,1,1,1,1,1,1,1,3,1,1,3,1,8,1,1,2,1,12,2,11,1,1,1,14,1,3,2,1,1,3,8,2,1,3,9,6,1,1,2,10,1,1,1,3,1,3,1,1,3,6,2,1,2,1,1,1,1,5,1,3,2,1,2,1,1,1,2,7,3,2,3,2,2,1,1,15,1,2,1,1,8,4,1,1,1,1,2,1,7,1,2,3,23,1,1,2,1,1,9,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,1,2,3,1,3,12,2,1,2,4,1,3,3,1,1,1,1,1,1,13,12,8,1,1,1,1,4,1,2,1,1,1,1,1,1,1,20,1,1,1,3,2,1,1,4,1,1,1,1,2,1,1,1,1,2,1,1,1,2,1,4,1,1,1,1,1,1,1,3,1,1,1,2,1,1,1,2,1,4,1,1,1,1,1,1,1,2,8,5,2,1,1,1,22,1,1,3,6,1,1,4,1,1,1,8,2,17,1,1,2,1,1,1,2,1,2,6,1,1,1,1,2,5,2,1,1,2,1,1,1,4,1,1,2,4,1,1,6,1,2,4,1,1,1,1,2,12,3,1,14,1,1,1,1,1,1,1,1,1,1,2,2,1,1,2,1,1,1,1,1,10,2,3,1,1,2,2,1,25,4,2,1,1,5,1,1,2,3,2,2,1,5,1,1,1,1,5,1,1,2,1,1,1,1,4,3,1,1,1,2,1,1,5,1,1,3,13,2,1,4,1,1,2,2,2,5,2,1,1,1,1,1,1,1,2,1,3,4,2,2,1,1,1,1,2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,3,5,3,1,7,1,3,2,1,25,1,1,1,2,2,3,1,2,2,1,1,1,2,2,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,6,1,3,1,3,2,1,1,3,1,1,2,2,1,12,1,1,1,1,2,1,4,2,1,3,1,21,1,1,3,1,1,1,2,1,3,1,1,1,1,7,1,2,1,1,1,5,3,1,1,1,3,12,2,9,1,1,1,1,1,1,2,4,1,1,1,4,1,1,1,3,1,1,1,1,2,1,3,4,1,2,1,1,1,4,1,1,1,3,2,1,1,4,1,1,3,2,8,2,1,1,1,5,1,3,2,1,4,2,1,1,1,6,14,1,3,4,2,1,2,1,3,1,2,1,1,1,1,1,1,1],"x":[-0.0349043170214982,0.0483103532108498,0.0494911957767512,-0.192789914215261,0.258778175250929,0.30337234744556,0.217101378807349,-0.108741708054041,0.498002986837078,0.208349251554197,0.101378807349009,-0.667697009689855,-0.847324002361685,0.0627583093112909,-0.343104226721773,0.294828604174626,0.0156635293300456,-0.406036189351578,-0.224255895530164,-1,-0.819400548744486,-0.683256347028792,0.29545375612128,-0.16542215121731,-0.714444483034071,0.217031917479943,-0.364567776890216,-0.23550863056993,-0.187788698642031,-0.229048727121175,-0.877748063765498,-0.15180773104574,-0.612544715729518,-0.913173340742542,0.993956864515681,-0.279477650817907,-0.154377800159761,-0.582954190254576,0.0180252144618482,-0.741187094085368,-0.923314694543813,-0.401729587052408,0.258291945959087,0.149654429896155,0.339006008404821,-0.897822387385823,-0.0312228666689821,-0.333240718230125,-0.246691904282291,-0.514395860104887,-0.726461292675303,-0.616365088736846,-0.482096342861112,-0.0256659604765047,-0.302469350189282,-0.967422637446602,-0.0314312506512,-0.195012676692252,-0.0642864585142221,0.49091793144167,-0.0416420657798771,0.324419129649568,-0.390546313340048,-0.902059528357587,0.179592262008127,-0.0336540131281909,-0.882610356683916,-0.244191296495676,0.039836071267322,0.0358767756051819,0.440836314381968,-0.129510644948425,0.246136213663043,-0.193415066161914,-0.154794568124197,-0.0289306428645851,-0.634702879172021,0.212308547216337,-0.861424651825096,-0.292119612405793,0.208349251554197,-0.517938387802591,0.0603271628520821,-0.887819956239364,0.584829646094537,-0.809537040252839,0.0171222172055709,0.222866668982044,0.0287917202097732,-0.668669468273539,0.229604417740423,-0.789184871322891,0.590664397596638,-0.689855173132359,-0.616920779356093,-0.28649324488591,-0.117354912652381,0.201819886778036,-0.763136873545653,-0.902684680304241,0.175841350328205,-0.221685826416143,-0.795783697426458,0.162365852811447,-0.399576285902824,0.229465495085611,-0.0426839856909665,-0.563713402563123,0.162365852811447,0.043795366929462,0.120966901677491,0.432848261730282,-0.24016253950613,-0.383947487236481,-0.455214809155003,-0.38498940714757,-0.773000382037301,0.0137880734900844,-0.897891848713229,0.138332233528983,-0.6903414024242,0.392560691834821,0.0311534053415761,0.0114958496856876,0.0738721216962455,0.0288611815371791,-0.534331261070399,-0.137081929635675,-0.853575521828222,0.0415031431250652,0.190428229083458,0.180564720591811,-0.523495293995068,-0.257597332685027,-0.175216198381551,-0.0840134754975167,-0.0873476192130032,-0.734866113291425,0.196610287222589,-0.580592505122773,-0.697843225784045,-0.869690549786406,-0.214253464383704,-0.180495259264404,-0.178064112805196,0.644913694300698,-0.124648352030007,-0.698676761712916,-0.645191539610322,-0.634425033862397,-0.593095544055847,-0.748341610808183,0.0956135171743133,0.0991560448720175,0.14819574202063,0.0173306011877887,0.166255687146181,0.0663008370089953,-0.547737297259751,-0.55239120619595,-0.833362275553086,-0.639981940054874,-0.755565588858403,-0.196401903240371,-0.344493453269892,-0.721390615774667,-0.723682839579064,-0.397839752717674,-0.188205466606467,0.486541867815094,-0.158267634494495,-0.389782238738582,-0.184593477581356,-0.957420206300142,0.268711145069982,0.0552564859514466,0.303233424790748,0.454728579863161,0.183343173688049,0.400687667141319,-0.265099156044872,-0.549057062480464,-0.734171500017365,0.278852498871253,-0.86170249713472,0.0898482269996179,-0.195151599347063,-0.488278401000243,-0.618032160594589,-0.783280658493384,0.219463063939152,-0.267808147813705,-0.900878685791686,0.313583162574237,-0.24516375507936,0.15972632237002,-0.736394262494356,-0.906852359948599,-0.706109123745355,-0.668669468273539,-0.5983746049387,-0.383600180599451,0.0681762928489562,-0.0879033098322508,0.497377834890425,-0.341089848227,0.0582433230299031,0.424929670406001,0.327405966728024,-0.149446045913937,-0.197374361824054,0.32282151911923,-0.214809155002952,0.273087208696558,-0.212725315180773,-0.902893064286458,-0.890737331990414,-0.920536241447574,-0.564824783801618,-0.0592852429409926,-0.207376792970514,-0.183412635015455,-0.0961692077935609,-0.122564512207828,0.166325148473587,0.232730177473692,-0.616226166082034,-0.84912999687424,0.0893619977077762,-0.979300524433022,-0.370888757684159,-0.586357795297468,-0.393116382454069,-0.307956795054353,-0.328239502656896,0.192303684923419,-0.232730177473692,-0.0847080887715764,0.282464487896364,-0.179592262008127,0.108255478762199,-0.809050810960997,-0.102142881950474,0.064703226478658,0.190775535720488,0.161601778209982,-0.342270690792901,-0.963949571076303,-0.298648977181954,0.253499114368076,-0.1816066405029,0.168756294932796,-0.916576945785434,-0.408050567846352,0.297329211961241,-0.39033792935783,0.27718542701351,0.579272739902059,0.981523286910013,0.0993644288542352,0.984926891952905,-0.655680200048623,-0.203903726600215,0.11804952592644,-0.207029486333484,0.0615774667453897,-0.783141735838572,-0.0945715972632237,0.983884972041816,0.247664362865974,-0.167714375021707,0.0277498002986836,-0.325044281596221,-0.530441426735665,-0.852116833952697,-0.534886951689647,0.183412635015455,-0.457229187649776,-0.918660785607613,-0.686798874726496,0.541485777793213,0.514882089396729,-0.376792970513666,0.0848470114263884,0.270517139582537,0.0603966241794882,-0.208210328899385,0.323238287083666,-0.697843225784045,-0.891779251901504,-0.478901121800438,0.244746987114924,-0.154099954850137,-0.206473795714236,0.558295419025458,1,0.133956169902407,0.449449518980308,0.297051366651617,0.238773312958011,0.429653040669607,0.957142360990519,-0.256416490119126,0.125690271941097,-0.163199388740319,0.0836661688604869,-0.191609071649359,0.254610495606571,0.185635397492446,-0.386656479005314,-0.0788038759420693,0.177925190150384,-0.304483728684055,0.487375403743965,0.0933212933699163,-0.305872955232175,0.300663355676727,-0.122633973535234,0.66484909526621,-0.839822179001841,-0.540096551245094,0.267738686486299,0.231479873580384,0.15576702670788,0.296426214704963,0.155558642725663,0.128329802382523,0.0814434063834961,0.173549126523808,-0.377626506442538,-0.126593269197374,-0.535095335671865,-0.399090056610982,0.149723891223561,-0.87358038412114,0.543013926996145,0.216892994825131,-0.184246170944327,0.0481714305560379,0.200222276247699,-0.659361650401139,0.0898482269996179,-0.709373806133435,0.146528670162887,0.0915152988573611,-0.644427465008856,-0.809050810960997,-0.707289966311256,0.214184003056298,-0.257527871357622,-0.542458236376897,-0.136040009724586,0.00281318375994166,0.222380439690202,-0.230785260306324,-0.736741569131386,-0.232660716146286,0.0762338068280486,-0.379015732990657,-0.17368804917862,-0.490987392769076,-0.596082381134303,0.238356544993575,0.282742333205988,-0.309415482929879,-0.0424061403813427,0.0410169138332235,-0.22397805022054,0.261765012329386,0.0483103532108498,-0.746813461605251,-0.388462473517869,-0.869551627131594,0.330670649116105,-0.117146528670163,0.0324731705622896,-0.645469384919946,-0.660820338276664,0.535164796999271,-0.302260966207064,0.380613343520995,-0.718612162678429,-0.901503837738339,-0.135414857777932,-0.106310561594832,-0.49418261382975,-0.472441218351683,-0.399576285902824,-0.0706769006355712,-0.794325009550932,0.492585003299413,0.206821102351266,0.204806723856493,-0.253985343659917,0.517243774528531,0.51140902302643,0.0747056576251173,-0.653596360226444,0.253846421005105,-0.133539401937971,-0.793283089639843,-0.0976973569964922,-0.31024901885875,0.313444239919425,0.0839440141701109,0.268502761087764,0.310179557531344,-0.67346229986455,-0.0171222172055708,-0.375751050602577,0.159934706352238,0.940263258430869,0.269127913034418,0.0800541798353767,0.203000729343938,-0.525301288507623,0.556906192477338,0.172576667940124,0.93283089639843,-0.170145521480915,-0.122008821588581,-0.905740978710103,-0.127843573090682,-0.850102455457924,-0.0400444552495398,0.15319695759386,0.0474073559545725,-0.73597749452992,0.455075886500191,0.399784669885042,-0.989928107526135,-0.104990796374119,0.0706074393081653,-0.643663390407391,-0.503351509047338,-0.377279199805508,0.208349251554197,0.139513076094884,0.182856944396207,0.292466919042823,-0.39103254263189,0.159240093078179,-0.299482513110826,-0.205362414475741,0.461188483311916,0.338936547077415,-0.892960094467405,-0.843989858646199,0.0276803389712776,0.0386552287014206,0.322057444517765,0.402146355016844,-0.546764838676067,0.465147778974056,-0.538846247351787,0.246830826937103,-0.534261799742993,0.0417809884346889,-0.161046087590734,0.293647761608724,-0.620046539089362,0.208071406244573,0.252943423748828,-0.66658562845136,-0.262668009585663,-0.129788490258049,0.263293161532317,-0.298579515854548,-0.166186225818775,0.0505331156878408,0.146042440871045,-0.613030945021359,-0.745841003021568,-0.77473691522245,0.0402528392317576,0.175077275726739,0.631577119438753,-0.711735491265238,-0.649289757927274,0.459035182162331,0.0242072726009794,-0.878442677039558,-0.22258882367242,-0.274129128607648,0.468968151981384,-0.212030701906713,0.27287882471434,0.157711943875247,-0.316083770360852,0.0841523981523287,-0.0024658771229118,-0.984440662661063,-0.287951932761435,-0.994720939117147,-0.478831660473031,-0.324349668322162,0.0750529642621471,0.512589865592331,0.122911818844858,0.175285659708957,-0.102351265932692,-0.0513666516167124,-0.142360990518529,-0.073246969749592,0.261626089674574,-0.049977425068593,0.942833327544889,-0.892265481193346,0.505504810196923,0.242385301983121,-0.387003785642344,-0.870454624387872,-0.181120411211058,0.505504810196923,-0.270169832945508,-0.699162991004758,0.316569999652693,0.0576181710832495,-0.647831070051749,0.979647831070052,-0.394366686347376,-0.400131976522071,-0.219601986593964,-0.655055048101969,-0.426805126245962,0.19813843642552,0.227520577918244,-0.130483103532109,-0.428680582085924,0.0942242906261939,0.994443093807523,-0.422567985274198,-0.519188691695898,-0.884902580488313,0.187649775987219,-0.220921751814677,0.447782447122565,0.262251241621227,0.0275414163164658,0.118118987253846,0.0945021359358178,0.280866877366026,-0.748411072135589,0.268294377105546,-0.642204702531865,0.587121869898934,-0.739172715590595,0.177577883513354,-0.294481297537596,-0.390129545375612,0.155141874761227,0.984093356024033,0.188761157225715,0.984232278678846,0.146250824853263,-0.238495467648387,-0.208071406244573,-0.547806758587157,-0.224047511547946,0.318653839474872,0.232938561455909,-0.648525683325808,-0.746257770986003,-0.0599798562150522,-0.889209182787483,-0.108116556107387,-0.984996353280311,0.0299031014482687,-0.699579758969194,0.0564373285173481,-0.710763032681554,0.277810578960164,0.188761157225715,0.598652450248324,-0.374222901399646,0.16542215121731,0.0580349390476853,0.0409474525058173,0.379363039627687,-0.54877921717084,0.974368770187198,0.0846386274441704,0.400548744486507,0.0911679922203315,-0.275726739137985,-0.0690792901052339,-0.527524050984614,0.970617858507276,0.188552773243497,-0.186955162713159,0.15576702670788,-0.706386969054979,0.0953356718646894,0.185357552182822,0.0351821623311221,0.52432882992394,0.254957802243601,0.216198381551072,0.267530302504081,0.233424790747751,-0.196471364567777,-0.995485013718612,-0.86600909943389,-0.31490292779495,0.13992984405932,0.392838537144445,-0.123328586809294,-0.577814052026534,-0.397770291390268,0.246761365609697,-0.746535616295627,0.0938075226617581,-0.551488208939673,-0.40186850970722,-0.60733511617407,0.031222866668982,-0.783766887785226,-0.404577501476053,0.67485152641267,0.301357968950787,0.238217622338763,-0.588858403084083,-0.498767061438544,-0.68346473101101,0.16938144687945,0.507658111346508,-0.695898308616678,-0.18091202722884,-0.262181780293821],"y":[-0.199154609006666,0.188207879477592,0.283802091800791,0.870264997561372,0.99111255622392,0.304178182409364,-0.325529724164092,-0.208042052782745,0.0176123123611338,-0.457865929659134,0.30070991166748,-0.516826532271175,0.693599956646616,0.0429740421611662,0.350999837424809,0.0592315612637513,0.417113748441988,0.351216604346177,0.223107353817807,0.660001083834607,-0.359995664661573,-0.801224733105728,-0.0445997940714246,0.661626835744866,-0.828970899040806,-0.449628786647158,-0.344713596705143,0.708990408063729,-0.141386224462147,0.733051536335555,-0.466861756895898,-0.123177803067252,-0.23958163984176,-0.497100742426706,0.703896385411586,0.508155855416463,0.365089687313716,0.877201539045142,-0.0149027258440361,-0.0413482902509076,0.539370292093427,-0.35186690511028,-0.523329539912209,-0.596705142795209,0.0890370129518236,0.453422207771094,-0.481601907548908,0.557145179645586,0.405083184306075,-0.0513195686338264,0.753536010404812,0.77792228905869,-0.698043678534656,-0.100634043245001,0.248252316696472,0.571451796455861,-0.503928900449791,0.523437923372893,-0.161220397767301,0.168807240015174,-0.496775592044654,-0.170541375386116,-0.893350674687043,0.556386495420799,-0.0986831409526906,0.651763940822631,0.470113260716415,0.632471684820897,-0.472064163008725,-0.45580664390614,-0.353275890099171,-0.234921151032352,0.936053758196499,-0.130656261854441,0.793963041239907,-0.0860022760526743,-0.504687584674579,-0.552484690836178,0.66065138459871,0.205224082804964,-0.523112772990842,-0.541754728228472,-0.320652468433317,-0.316642280388013,0.36714897306671,-0.373326830325692,0.00113802633718096,0.809678643039073,-0.012843440091042,-0.31100634043245,0.772069582181759,0.0504525009483554,0.388608898282122,0.902021351541755,-0.267219422316154,0.42383352300439,-0.473364764536932,-0.786918116295453,0.788652251666396,-0.310030889286295,-0.320327318051265,0.0765729149731753,0.577087736411424,-0.651872324283314,-0.833739771310898,0.960873570693112,0.637674090933724,-0.504687584674579,-0.375928033382106,0.422099387633447,0.367690890370129,0.246409797864846,0.0291009591936271,-0.30851352083672,-0.593453638974692,-0.64092559475424,0.664878339565382,0.431095214870211,-0.324012355714518,-0.204357015119493,-0.171083292689535,-0.38633284560776,-0.048609982116729,0.132607164146751,-0.44691920013006,0.429902996802688,-0.901804584620387,-0.607977022706335,0.256381076247765,-0.430336530645423,-0.847287703896385,-0.842302064704926,-0.634747737495258,0.179645586083564,0.38297295832656,-0.236004985639191,-0.218555248469083,-0.0992250582561101,-0.774995935620224,-0.436514387904406,0.661626835744866,0.370725627269279,0.0168536281363465,0.651005256597843,0.772394732563811,0.240773857909283,-0.211727090445998,-0.821709207174985,0.738579092830434,0.742372513954371,0.875142253292148,-0.0964070882783286,0.362488484257302,0.482035441391644,-0.0210805831030184,0.551292472768656,0.51888581802417,0.426109575678752,-0.971169999458083,-0.374952582235951,0.235029534493036,-0.52918224678914,-0.00514821438248514,-0.513791795372026,0.336259686771799,-0.86354522299897,0.736844957459492,-0.806427139218555,0.901262667316967,0.206199533951119,0.408659838508644,-0.830054733647645,0.922830975993064,0.569067360320815,-0.0591231778030671,-0.290413482902509,0.204357015119493,-0.3429794613342,0.524521757979732,-0.392293935945375,0.00330569555085902,-0.15590960819379,0.730016799436406,-0.244458895572536,0.480301306020702,0.472172546469409,0.928358532487942,-0.727307212919308,-0.579580556007153,0.547824202026771,-0.526039126429307,0.178344984555357,0.43163713217363,0.287270362542676,-0.239906790223812,-0.601582398525985,-0.905923156126375,0.445401831680486,0.678534655611554,0.882295561697285,0.828537365198071,0.381347206416301,0.277299084159757,-0.0960819378962769,0.0765729149731753,0.568200292635344,-0.130873028775809,-0.359236980436785,-0.5725356310627,0.388392131360755,0.54002059285753,0.345580664390614,0.23069419606568,-0.487996531729258,0.524521757979732,-0.368232807673549,0.502411532000217,0.581748225220831,-0.408334688126592,0.511082208854929,0.2184468650084,-0.500894163550642,0.579038638703734,-0.0390722375765458,-0.589009917086653,-0.0758142307483878,0.859209884571615,0.588142849401182,-0.355226792391481,0.65924239960982,-0.354576491627378,0.862244621470764,-0.299951227442692,0.397496342058202,0.412995176936,-0.862678155313499,0.752343792337289,-0.000704492494445264,-0.0554381401398146,0.707906573456891,-0.286945212160624,0.638757925540563,0.566249390343034,-0.524413374519048,-0.0261746057551616,-0.418631116891562,-0.289438031756354,0.556494878881483,0.217037880019509,-0.281092505283694,-0.519102584945537,0.0954316371321735,0.496775592044654,-0.569717661084918,-0.0578225762748603,-0.668563377228635,0.988944887010242,0.0490435159594647,0.775104319080908,0.464802471142904,0.724272476020159,0.795046875846746,0.516501381889124,-0.3779873191351,0.537311006340433,0.516284614967756,0.564623638432775,0.0566303582073375,0.708882024603046,-0.26765295615889,0.106811900503983,0.612203977673007,0.465236004985639,-0.439440741342871,0.724706009862895,-0.170324608464748,0.507288787730992,-0.609386007695226,-0.485503712133528,0.926299246734948,0.249336151303311,-0.0237901696201159,0.448111418197583,0.111472389313391,0.0389638541158619,-0.350132769739338,0.0335446810816671,0.279683520294803,0.908849509564841,0.439874275185607,-0.57697935295074,0.908741126104156,0.809678643039073,0.472931230694196,-0.0124099062483065,0.716252099929551,0.370400476887227,0.217796564244296,0.0452500948355281,-0.585975180187503,-0.372242995718853,0.693491573185932,0.0363626510594484,-0.0525117867013493,0.803067251937355,-0.43803175635398,-0.210643255839159,0.903647103452013,-0.20067197745624,0.45331382431041,-0.0895789302552429,-0.212269007749417,0.713867663794505,-0.235788218717824,-0.101392727469788,0.227767842627215,-0.156451525497209,-0.58976860131144,0.246084647482794,0.254105023573403,-0.450712621253997,1,0.791795372026229,0.497859426651493,0.290305099441825,0.299626077060641,0.46859589226684,0.505988186202786,0.53167506638487,-0.869397929875901,-0.0073158835961632,-0.973337668671761,-0.888256652034899,-0.580122473310573,-0.355877093155584,0.235354684875088,0.763615672248415,0.688289167073105,-0.45970844849076,-0.852490110009213,0.909174659946892,0.565273939196879,-0.122635885763832,0.0111093047200999,-0.0822088549287379,0.799815748116838,0.608410556549071,-0.841001463176719,-0.340811792120522,-0.00319731209017493,-0.657183113856825,-0.000270958651709674,0.20121389475966,0.785075597463827,0.565273939196879,0.74681623584241,0.0710453584782964,-0.515417547282285,-0.666937625318376,-0.507722321573728,-0.0646507342979461,-0.547715818566087,-0.245867880561426,-0.209125887389584,0.213244458895572,0.597788977402049,0.196336639028884,0.625751910258495,-0.460141982333496,-0.502736682382269,0.806318755757871,0.402915515092397,0.64341841434997,-0.187449195252804,-0.508264238877147,0.150056901316859,-0.481818674470276,-0.275131414946079,-0.0853519752885709,0.201647428602395,-0.647428602395274,-0.0916382160082371,-0.384490326776134,0.222673819975072,-0.179862353004931,-0.746165935078307,0.030184793800466,-0.313607543488864,0.527339727957514,0.750826423887715,-0.213786376198992,-0.32878122798461,0.744215032785997,0.334525551400856,0.188966563702379,0.0320273126320925,0.236004985639191,0.895193193518669,-0.150056901316859,-0.588901533625969,0.554110442746437,-0.0328943803175634,0.680702324825232,0.353926190863274,-0.0125182897089904,-0.508589389259199,0.329865062591449,-0.282284723351216,-0.218988782311819,0.357719611987211,-0.575787134883217,0.675608302173089,-0.231994797593887,-0.0586896439603316,-0.0379884029697067,-0.184306074892971,-0.0405896060261204,0.502519915460901,0.742697664336422,-0.188099496016908,-0.609386007695226,-0.47889232103181,0.60700157156018,0.646886685091855,-0.239364872920392,-0.746491085460359,0.526147509889991,-0.327805776838454,0.289004497913618,-0.642768113585867,0.659784316913239,0.049802200184252,0.327589009917087,0.76209830379884,-0.0629165989270036,-0.334417167940172,0.0628082154663199,-0.745515634314204,-0.857909283043408,0.307212919308514,-0.322278220343576,-0.728282664065464,0.695984392781662,0.359345363897469,-0.277732618002493,-0.39717119167615,-0.302985964341841,-0.357177694683791,0.00298054516880719,0.653172925811521,0.360104048122257,-0.679401723297025,-0.385790928304341,0.294857204790549,-1,-0.580447623692624,-0.647645369316642,-0.330406979894868,0.386007695225709,-0.175310247656208,-0.339402807131632,-0.44106649325313,0.239690023302444,-0.530916382160082,0.205332466265648,-0.620441120684983,-0.494933073213028,0.587167398255026,-0.102043028233891,-0.145721562889503,-0.734677288245814,-0.56614100688235,-0.894000975451146,0.0452500948355281,-0.519969652631008,-0.377120251449629,0.23708882024603,-0.887823118192164,0.909174659946892,0.272855362271718,0.588901533625969,0.692624505500461,0.205874383569068,-0.255405625101609,0.279466753373435,0.20316479705197,0.97192868368287,-0.136617352192056,0.461767734243755,0.55085893892592,0.189183330623747,0.673332249498727,0.22039776730071,0.674307700644882,0.0412399067902238,0.340920175581206,-0.429361079499268,-0.243049910583645,0.0542459220722917,0.516284614967756,0.109304720099713,0.651980707743998,-0.325638107624776,-0.12924727686555,0.974529886739284,0.0278003576654202,0.731859318268032,-0.376361567224841,0.236330136021243,0.887172817428061,0.428277244892429,0.489080366336097,0.0877364114236168,-0.0310518614859372,0.357719611987211,-0.180621037229719,-0.556278111960115,0.475965967593345,-0.760797702270633,0.751368341191134,-0.651438790440579,0.404324500081288,0.555411044274644,-0.751693491573186,-0.58976860131144,-0.837208042052783,0.947434021568309,-0.411261041565057,-0.476507884896765,-0.0165284777542947,0.729366498672303,-0.447352733972796,-0.115590960819379,-0.453747358153146,-0.216387579255406,0.652522625047418,-0.335934536389747,-0.141928141765566,0.511407359236981,-0.283476941418739,-0.242941527122961,-0.497317509348074,-0.913184847992196,0.984934698964938,-0.736953340920176,0.0314853953286729,-0.854224245380155,0.111038855470655,0.231344496829784,-0.863761989920338,-0.196445022489568,0.68482089633122,-0.463285102693329,0.660109467295291,-0.756570747303961,0.689373001679944,0.379396304123991,-0.910150111093047,0.0595567116458029,-0.189400097545115,-0.550208638161817,-0.267327805776838,-0.110280171245868,0.495474990516447,-0.346881265918821,-0.507722321573728,0.646128000867068,0.656641196553406,0.743347965100526,-0.18842464639896,0.702162250040644,-0.513466644989974,-0.041998591015011,0.376469950685525,-0.649379504687585,-0.400314312035983,-0.422749688397551,-0.0901208475586625,-0.676583753319243,-0.998157481168374,0.662385519969653,-0.370942394190646,-0.364547770010296,-0.000812875955129133,0.343954912480356,0.50306183276432,-0.860510486099821,0.720804205278274,-0.832114019400639,0.856175147672465,0.0493686663415165,0.657399880778193,0.314366227713651,-0.791145071262125,-0.072237576545819,-0.0631333658483715,-0.065842952365469,-0.510757058472877,0.0650842681406818,0.868205711808378,0.595729691649055,0.6459112339457,0.512382810383136,0.702920934265431,-0.0752723134449682,-0.664878339565382,-0.252154121281092,-0.387958597518019,0.33658483715385,0.260499647753753,0.777597138676638,-0.465127621524955,-0.169891074622013,0.376253183764158,0.843819433154501,0.633772286349103,0.0623746816235844,-0.758413266135588,0.24901100092126,-0.53806969056522,0.780306725193735,-0.424483823768493,-0.76068931880995,0.912751314149461,0.116241261583482,-0.255297241640925,0.923372893296483,0.87048176448274,0.165989270037392]},"edges":{"from":[5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,12,12,18,19,19,19,19,23,23,23,23,23,23,34,34,34,34,34,45,45,45,58,58,58,58,70,70,70,70,70,70,70,70,70,70,72,72,72,73,73,73,91,91,92,92,92,92,92,92,92,92,92,92,92,92,93,93,94,94,94,95,95,97,97,111,111,111,123,123,123,123,123,123,123,123,137,137,137,137,137,137,137,147,147,147,147,147,147,147,147,149,149,149,157,157,159,159,159,159,159,159,159,167,167,167,168,168,170,170,175,175,175,178,178,179,179,179,179,179,179,182,190,190,190,190,190,190,190,190,190,190,190,190,190,190,191,193,193,198,198,198,198,198,198,198,198,201,201,202,202,202,208,208,208,222,222,222,222,222,225,225,225,225,225,225,233,233,235,235,235,235,235,235,235,235,235,235,237,237,237,237,237,237,237,237,237,242,242,242,242,242,242,242,242,247,247,253,253,253,253,253,261,261,261,261,262,262,262,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,275,280,280,280,280,280,280,285,285,285,285,285,285,285,285,287,287,287,287,289,289,290,290,290,290,290,290,290,290,290,291,291,291,294,294,294,295,295,295,295,295,295,295,298,298,298,299,300,300,301,301,301,303,303,308,308,310,310,310,310,310,313,316,316,316,316,316,316,316,316,316,320,321,321,321,321,321,321,324,324,324,324,324,326,326,326,326,326,329,329,332,332,332,332,332,332,332,332,332,332,332,332,342,342,342,346,351,351,351,351,351,351,351,351,352,352,354,354,355,355,355,355,355,355,355,376,376,376,376,377,377,377,378,378,386,386,386,386,386,394,394,394,404,404,404,404,406,406,406,406,406,406,406,406,406,409,409,409,410,410,410,410,410,416,416,416,416,424,424,434,440,440,440,440,440,445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,447,455,455,455,455,455,455,455,455,455,455,455,455,455,455,455,455,464,464,470,473,473,473,473,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,479,479,479,479,485,485,485,485,485,485,485,485,489,489,489,491,495,495,495,495,498,498,498,498,498,498,503,503,507,507,511,511,511,511,511,511,511,511,511,511,515,515,515,515,515,515,515,516,516,516,516,516,516,516,516,518,518,518,518,518,528,528,528,532,532,532,532,532,538,538,538,538,538,538,538,538,538,538,538,538,540,542,542,542,545,547,547,547,550,550,551,551,551,551,551,553,562,562,562,562,567,567,569,569,569,569,569,577,577,577,577,579,586,586,586,586,586,586,586,592,592,592,592,592,592,592,594,594,594,594,594,594,601,601,607,607,607,612,612,612,612,612,612,612,612,612,612,632,633,633,633,633,638,638,638,638,648,662,662,673,673,676,676,676,690,690,694,694,694,694,694,694,698,698,698,698,698,698,698,698,698,698,701,701,701,704,704,704,711,711,711,713,713,714,715,715,716,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,719,719,719,723,723,723,723,723,726,726,726,726,728,728,728,728,728,728,729,729,729,729,729,729,729,729,729,732,732,732,737,737,742,744,748,748,748,748,748,759,759,762,762,762,762,762,762,762,766,766,766,766,767,767,767,767,768,768,768,768,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,777,777,787,793,799,799,802,802,804,804,804,804,804,804,804,804,804,804,806,806,806,806,806,807,817,817,817,817,817,820,822,823,823,828,828,828,830,831,831,831,845,845,854,855,857,857,857,865,865,865,872,872,876,876,876,877,877,877,877,877,878,878,878,879,879,879,879,879,880,880,884,884,886,886,886,895,895,895,895,895,895,895,895,895,895,895,895,895,895,901,902,902,902,902,902,902,905,905,905,905,905,905,905,905,905,905,905,911,911,911,920,921,921,921,921,921,921,925,925,930,930,930,933,938,938,938,938,938,938,940,940,940,945,945,945,945,945,945,945,958,958,958,958,958,958,958,964,964,964,964,964,969,969,969,969,972,972,972,972,972,972,972,972,972,977,977,977,977,977,977,977,977,977,977,977,977,977,982,982,982,982,982,982,982,982,990,990,990,996,996,996,996,996,996,1003,1003,1016,1016,1016,1018,1018,1018,1021,1021,1021,1021,1031,1045,1051,1056,1056,1056,1059,1059,1059,1059,1059,1060,1063,1070,1070,1070,1070,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1076,1076,1076,1076,1076,1085,1085,1093,1093,1097,1099,1099,1099,1114,1116,1116,1122,1122,1122,1123,1123,1123,1128,1138,1138,1138,1138,1142,1142,1142,1142,1142,1142,1148,1154,1158,1158,1158,1158,1164,1167,1167,1167,1167,1174,1174,1174,1174,1177,1177,1181,1188,1193,1193,1193,1193,1193,1193,1193,1196,1196,1196,1196,1196,1196,1200,1200,1200,1200,1201,1209,1209,1209,1211,1211,1211,1211,1211,1212,1212,1223,1223,1223,1232,1232,1232,1232,1232,1232,1233,1233,1233,1235,1240,1240,1242,1250,1250,1252,1252,1252,1252,1256,1256,1256,1256,1257,1257,1259,1266,1266,1266,1268,1271,1271,1273,1273,1279,1279,1281,1281,1281,1281,1281,1281,1281,1282,1282,1282,1282,1282,1287,1303,1303,1311,1311,1311,1311,1311,1311,1311,1311,1313,1313,1317,1322,1322,1322,1322,1322,1322,1322,1329,1329,1329,1333,1333,1333,1333,1333,1368,1368,1375,1379,1379,1379,1379,1379,1379,1379,1379,1387,1387,1387,1387,1387,1387,1387,1387,1387,1387,1387,1387,1387,1387,1387,1392,1392,1392,1395,1407,1409,1409,1409,1417,1420,1420,1421,1421,1424,1424,1424,1424,1424,1438,1438,1438,1438,1438,1438,1449,1449,1450,1450,1450,1450,1450,1453,1455,1455,1455,1463,1465,1468,1471,1471,1471,1481,1481,1481,1488,1488,1488,1488,1488,1492,1492,1492,1493,1497,1499,1499,1499,1499,1500,1500,1504,1505,1508,1508,1521,1524,1524,1524,1528,1528,1528,1528,1528,1528,1534,1534,1534,1534,1535,1535,1535,1535,1536,1536,1536,1538,1538,1538,1538,1543,1543,1544,1545,1548,1548,1548,1548,1549,1560,1560,1560,1560,1560,1562,1562,1571,1574,1578,1578,1585,1586,1597,1597,1598,1598,1616,1616,1619,1619,1619,1639,1643,1644,1644,1650,1650,1654,1654,1654,1654,1655,1655,1656,1657,1657,1657,1657,1657,1657,1657,1657,1657,1657,1657,1661,1661,1661,1661,1661,1661,1662,1662,1662,1665,1670,1670,1670,1670,1674,1677,1677,1688,1694,1694,1694,1694,1694,1694,1694,1694,1694,1694,1694,1694,1694,1694,1694,1694,1715,1715,1720,1729,1729,1729,1730,1730,1730,1730,1736,1736,1745,1747,1754,1756,1756,1757,1757,1758,1758,1758,1758,1758,1758,1760,1772,1772,1772,1772,1772,1772,1785,1787,1787,1789,1789,1801,1801,1801,1804,1804,1804,1807,1807,1811,1811,1811,1817,1817,1817,1817,1817,1819,1819,1819,1825,1825,1825,1825,1825,1833,1833,1836,1836,1841,1841,1841,1845,1845,1848,1858,1859,1878,1886,1890,1890,1916,1916,1916,1916,1918,1936,1936,1936,1937,1939,1939,1939,1939,1944,1948,1948,1948,1948,1954,1971,1975,1996,1996,1996,2002,2002,2002,2004,2011,2011,2011,2015,2015,2019,2019,2023,2024,2024,2042,2046,2046,2059,2069,2069,2078,2083,2090,2090,2099,2105,2113,2113,2113,2113,2113,2113,2113,2116,2116,2116,2116,2119,2119,2119,2119,2119,2119,2119,2119,2119,2130,2140,2141,2155,2174,2179,2179,2194,2194,2199,2202,2202,2246,2246,2246,2250,2252,2252,2258,2258,2260,2262,2282,2282,2299,2304,2305,2309,2315,2315,2317,2326,2326,2326,2336,2341,2363,2369,2370,2370,2375,2375,2375,2376,2376,2377,2379,2382,2385,2385,2385,2385,2385,2411,2411,2423,2424,2426,2426,2452,2473,2476,2481,2481,2481,2523,2542,2542,2542,2543,2543,2543,2543,2543,2544,2585,2597,2614,2615,2617,2617,2617,2620,2620,2638,2640,2645,2683,2691,2786,2787,2849],"to":[717,878,905,1056,1085,1138,1201,1281,1282,1395,1694,1747,1779,1822,1872,1909,2196,2303,2539,2543,2653,1656,1694,905,698,768,2691,2875,332,1174,1471,2202,2299,2509,877,1492,1819,2004,2105,477,1571,1765,455,704,1747,1801,772,806,917,1271,1281,1329,1438,1778,2336,2703,168,2099,2543,717,905,2699,351,2108,316,354,538,972,977,1251,1674,1760,1893,2182,2744,2786,1694,1841,759,1825,2256,1281,1348,540,567,1825,2781,2799,945,996,1694,2113,2119,2194,2199,2326,977,1059,1939,2246,2252,2614,2741,396,410,445,1528,1925,2043,2446,2605,711,762,2516,1093,1165,694,698,1535,1657,1890,2119,2733,711,762,1569,2099,2543,1060,1971,179,1657,2553,190,336,698,1078,1535,1657,2119,2733,2446,289,336,346,878,1018,1085,1138,1395,1505,1841,1872,2124,2196,2326,445,1259,1886,1193,1232,1333,1379,2375,2426,2542,2677,265,2119,612,933,2088,715,1063,2803,404,409,551,1694,2045,445,638,744,1545,1734,2141,972,977,445,518,1070,1138,1311,1757,1971,2006,2385,2432,958,1661,1817,2116,2481,2585,2620,2787,2824,477,485,879,1021,1524,1833,2543,2787,772,1281,316,876,884,972,1310,294,300,455,2787,265,920,2119,447,511,612,717,729,772,806,905,920,1073,1322,1387,1493,1694,1756,1772,1954,2019,2105,2119,2326,2556,1954,538,766,828,1597,2617,2786,895,1196,1560,1948,2119,2617,2786,2803,854,1311,1754,2385,346,1841,355,1073,1142,1450,1654,1729,2113,2250,2525,799,977,1141,300,455,2787,938,964,1200,1209,1322,2379,2733,633,1387,2285,772,455,2787,1677,2090,2579,1521,2538,972,977,477,723,1031,1841,2206,495,538,831,876,884,972,977,1310,2317,2744,1657,324,586,1536,1662,2638,2787,586,1536,1662,2638,2787,807,925,1375,2468,2655,704,2771,406,491,1174,1313,1407,1471,2202,2299,2309,2418,2509,2726,698,1317,1388,1841,498,743,1252,1643,1707,2108,2139,2385,2543,2585,1674,1893,1142,1450,1654,1729,2113,2250,2525,865,2543,2585,2711,498,1311,2385,804,1282,473,542,1528,2042,2605,434,772,2627,409,551,1694,2045,416,1481,1534,1585,1694,1769,2309,2726,2826,551,1694,2045,445,1715,1820,1925,2091,1481,1534,1585,2826,2141,2811,2627,895,1266,1303,2849,2872,498,518,547,638,1070,1138,1311,1545,1715,1734,1757,1925,1971,2006,2091,2587,1073,577,748,1003,1154,1311,1455,1628,1688,1789,1878,2114,2282,2385,2422,2608,2787,648,2700,2786,542,1528,2042,2605,485,503,879,1021,1233,1524,1548,1571,1644,1661,1765,1833,1836,1841,2155,2206,2326,2539,2543,2634,2787,516,1598,2326,2572,857,1212,1562,1798,879,1021,1524,1833,2011,2543,2700,2787,767,787,2538,2418,1655,2119,2278,2472,547,1252,1311,1643,2385,2516,2155,2634,567,729,717,729,772,806,905,1337,1387,1493,2105,2472,772,806,1338,1936,2069,2174,2198,690,822,1287,1386,1572,1598,2326,2572,1070,1138,1757,1971,2006,1257,1311,2385,1167,1619,2376,2385,2630,766,828,886,972,977,1051,1562,1597,2617,2619,2744,2786,567,1528,2042,2605,2539,1311,1545,2359,820,2655,921,1694,2045,2640,2702,1694,1392,2258,2638,2787,729,2472,732,1311,1508,2559,2674,1455,1789,1878,2114,1465,804,1282,1387,1536,1662,2638,2787,594,1076,1538,2002,2411,2683,2700,1076,1538,2002,2411,2683,2700,1311,2085,872,2113,2921,777,933,1073,1322,1694,1772,2019,2088,2326,2556,633,1387,2282,2285,2771,716,1545,1734,2594,2700,982,2840,886,2694,972,977,1465,1287,2326,698,1535,1657,1890,2119,2733,768,1317,1388,1535,1657,1890,2119,2691,2733,2875,772,1463,2159,1747,1801,2771,762,1569,2516,714,1948,1948,1063,2803,2594,719,729,772,806,845,905,1188,1337,1387,1488,1493,1497,1499,1779,1945,2105,2369,2472,2699,845,1188,1499,1548,1694,1841,2262,2692,1499,1758,2179,2472,817,1256,1488,1500,1858,2267,772,806,905,1211,1387,1493,2105,2369,2472,1508,2078,2648,982,2065,1465,2141,1003,1154,1311,1628,2385,1825,2256,880,1569,2140,2160,2502,2516,2519,828,1597,2617,2786,787,2385,2538,2817,793,851,2691,2875,806,905,917,1177,1268,1281,1338,1379,1387,1493,1529,1777,1936,2069,2105,2159,2174,2198,2308,2703,933,2088,2538,851,977,1141,1093,2704,921,1282,1387,2086,2385,2476,2539,2618,2638,2787,905,1387,1493,2105,2703,2468,1256,1488,1500,1858,2267,2655,1572,1252,2794,1597,2617,2786,1836,972,2317,2744,1188,1499,1754,2139,1212,1562,1798,2543,2585,2711,2113,2921,884,972,1310,1290,1492,1819,2004,2105,1138,1395,2196,1021,1524,1833,2543,2787,2140,2502,972,1310,2617,2619,2694,1196,1266,1303,1543,1560,1785,1948,2119,2164,2617,2786,2803,2849,2872,2803,1073,1670,1825,2315,2377,2799,1085,1387,1488,1493,1497,1499,1779,1945,2105,2303,2699,1420,1801,2285,2119,1281,1387,2129,2618,2640,2702,1375,2655,1730,2363,2824,2088,964,1200,1209,1322,2379,2733,1807,1819,2051,996,1694,2113,2119,2194,2199,2326,1661,1817,2116,2481,2620,2787,2824,1200,1209,1322,2379,2733,1528,1736,2305,2605,977,1051,1162,1310,1465,1562,1674,2317,2744,1051,1059,1141,1465,1562,1674,1939,2182,2246,2252,2614,2741,2744,1250,1311,1468,2065,2091,2385,2774,2840,1758,2597,2666,1694,2113,2119,2194,2199,2326,1154,1628,1116,1758,1890,1085,1505,2326,1524,1833,2543,2787,2704,2803,1562,1282,2543,2653,1939,2246,2252,2614,2741,1971,2803,1138,1757,1971,2006,1074,1242,1273,1322,1417,1657,1670,1694,1745,1772,1825,2019,2119,2215,2315,2326,2341,2377,2556,2662,2799,1538,2002,2411,2683,2700,1505,2303,1165,2704,1535,1387,2473,2787,1562,1758,1890,1616,1662,2787,1387,1845,2624,2634,1757,1971,2006,2196,1450,1654,1729,2113,2250,2525,1233,1628,1548,2523,2692,2850,2385,1619,2376,2385,2630,1471,2202,2299,2509,1329,2517,2375,1499,1232,1333,1379,2375,2426,2542,2677,1560,1948,2119,2617,2786,2803,1209,1322,2379,2733,2543,1322,2379,2733,1499,1918,2228,2369,2472,1562,1798,1801,1944,2270,1333,1379,2375,2426,2542,2677,1644,1836,2539,2326,2179,2810,2215,1468,2385,1846,1954,2445,2794,1488,1500,1858,2267,1311,2385,1886,1303,2849,2872,1529,2336,2703,1417,2315,1548,1694,1348,1387,1845,1975,2105,2539,2712,1387,2086,2543,2638,2653,2326,2849,2872,1643,2085,2282,2385,2423,2432,2516,2674,1407,2309,1388,1694,1772,2019,2326,2379,2556,2733,1848,2517,2703,1379,2375,2426,2542,2677,2083,2585,2655,1834,2304,2375,2426,2542,2544,2651,2677,1493,1694,1745,1787,1845,1975,2090,2105,2285,2471,2473,2624,2638,2749,2787,2258,2638,2787,1872,2309,1421,2452,2539,2315,1801,2285,2452,2539,1657,1804,2015,2119,2748,1761,2023,2260,2655,2703,2863,1549,1841,1654,1729,2113,2250,2525,2090,1789,1878,2114,2822,2141,2385,2202,2299,2509,1534,1585,2826,1497,1499,1500,1858,2267,1819,2004,2105,2105,1499,1758,2179,2228,2472,1858,2267,2538,1575,2078,2648,2538,1833,2543,2787,1736,2042,2043,2305,2446,2605,1585,1694,1769,2826,1657,1890,2119,2733,1662,2638,2787,2002,2411,2683,2700,1785,2164,2228,1734,1661,1694,2262,2692,1841,1948,2119,2617,2786,2803,1798,1893,1765,2085,1694,2243,2826,2379,2617,2786,2326,2572,1662,2787,2376,2385,2630,1954,2139,1836,2539,1836,2090,1729,2113,2250,2525,2119,2472,1694,1758,1804,1890,2015,2119,2270,2379,2456,2553,2733,2748,1817,2116,2481,2620,2787,2824,2144,2638,2787,2786,1825,2315,2377,2799,1893,2090,2579,2608,1769,1772,1841,2019,2045,2113,2119,2194,2199,2243,2262,2326,2543,2556,2692,2787,1820,2587,2703,2113,2250,2525,1937,2059,2645,2760,2305,2605,1772,1801,2847,1954,2255,1971,2006,1890,2179,2270,2472,2597,2666,2786,2019,2256,2326,2341,2556,2662,2164,2090,2471,1878,2114,1944,2270,2285,2015,2119,2748,1819,2051,1841,2424,2656,2116,2481,2620,2787,2824,2004,2051,2105,2256,2315,2377,2781,2799,2543,2787,2090,2539,2206,2424,2656,2539,2624,2703,2267,2304,2114,2446,2119,2733,1996,2011,2130,2549,2472,2069,2174,2198,2760,2246,2252,2614,2741,2270,2119,2617,2786,2803,2445,2006,2105,2011,2130,2549,2411,2683,2700,2105,2130,2549,2700,2119,2748,2326,2556,2655,2543,2655,2605,2615,2810,2760,2174,2198,2648,2585,2471,2579,2543,2785,2119,2194,2199,2250,2326,2525,2921,2481,2620,2787,2824,2194,2199,2326,2472,2617,2733,2748,2786,2803,2549,2502,2811,2634,2198,2472,2810,2199,2326,2326,2299,2509,2252,2614,2741,2525,2614,2741,2638,2787,2863,2692,2422,2771,2509,2677,2605,2726,2377,2799,2744,2539,2556,2572,2703,2662,2824,2472,2382,2516,2426,2542,2677,2385,2630,2799,2733,2516,2423,2432,2516,2630,2817,2683,2700,2432,2656,2542,2677,2539,2787,2539,2620,2787,2824,2850,2544,2651,2677,2585,2653,2655,2711,2787,2651,2711,2666,2741,2810,2619,2786,2803,2787,2824,2787,2702,2760,2700,2875,2803,2824,2872],"value":[35,17,42,6,10,6,15,15,6,22,39,28,10,28,10,28,6,10,15,50,6,15,15,28,6,6,6,6,4,4,4,4,4,4,5,5,5,5,5,10,10,10,28,10,35,10,51,10,15,10,15,28,15,28,10,32,10,10,10,10,10,10,15,15,5,10,5,29,40,28,22,15,10,39,5,39,15,15,10,10,10,15,15,15,15,15,15,28,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,28,10,10,39,10,15,15,15,10,10,10,15,15,7,19,7,7,19,19,7,10,10,10,10,10,15,15,28,15,15,15,15,5,28,5,5,5,5,28,10,15,10,17,51,26,6,22,10,35,35,28,6,52,28,15,15,2,2,2,2,2,2,2,2,28,28,10,10,10,10,10,10,5,5,5,5,5,6,6,15,6,6,15,15,15,3,3,3,3,10,3,3,3,10,10,2,2,2,2,2,28,2,2,2,2,2,2,2,2,2,2,2,15,15,5,5,5,5,5,6,6,25,25,10,35,10,15,1,31,9,1,9,9,1,10,61,31,9,1,2,15,2,15,2,9,65,2,2,28,4,4,4,4,4,4,2,2,2,2,31,2,2,2,15,52,15,39,10,10,2,28,2,2,2,2,2,2,2,10,10,10,6,6,6,3,3,3,3,3,3,3,10,10,10,28,6,6,22,22,22,15,15,15,15,35,15,28,45,10,28,5,6,5,5,21,5,5,6,12,28,4,4,4,4,4,4,4,4,4,4,4,15,10,10,15,10,15,15,10,15,4,10,10,4,4,4,22,15,4,10,10,10,10,10,15,28,15,15,57,15,15,28,15,15,10,10,2,2,2,2,2,2,2,6,6,6,6,10,10,10,15,15,5,5,5,5,5,28,28,28,5,5,5,5,5,5,16,5,10,10,10,10,5,5,5,5,63,15,15,10,28,5,5,5,5,15,15,28,5,5,5,5,5,10,3,10,6,3,3,10,6,15,6,3,10,3,3,28,15,39,5,17,6,6,10,5,6,15,5,5,5,15,10,52,15,43,15,15,28,5,5,5,5,2,22,2,2,6,2,15,10,6,15,10,2,6,35,22,10,39,56,2,22,2,6,6,6,6,6,6,50,6,2,2,2,2,15,2,15,2,10,10,10,15,10,10,28,10,10,15,54,15,42,26,22,22,15,15,18,18,1,1,1,15,1,1,1,15,58,48,48,5,5,5,5,10,15,26,48,15,6,30,6,3,3,3,3,3,10,10,10,12,12,12,12,5,4,4,10,27,37,6,62,4,15,10,5,4,15,5,5,5,28,10,28,28,15,15,10,5,5,10,35,28,6,6,6,6,28,15,28,28,28,28,48,5,5,24,24,28,6,6,6,4,4,11,4,3,3,3,3,3,3,3,3,3,3,3,3,3,15,15,10,10,10,10,32,2,2,2,2,2,32,2,2,28,10,15,10,15,15,6,6,15,15,28,28,15,15,10,10,10,10,10,7,7,7,7,7,7,6,10,10,14,14,19,44,6,14,6,15,28,39,10,10,15,42,10,10,28,28,28,10,10,15,6,36,9,9,6,60,6,15,9,6,1,6,15,26,15,9,10,26,10,6,6,6,6,6,15,6,6,6,6,6,6,4,4,4,4,4,4,1,1,18,15,1,1,1,26,45,51,10,10,15,15,28,15,6,6,10,6,10,10,10,26,10,26,28,10,10,28,4,4,4,4,10,15,10,15,39,15,6,6,41,1,15,28,15,28,48,28,9,1,15,28,5,5,9,15,5,5,28,10,10,10,10,15,10,10,15,15,15,43,6,15,28,28,28,15,25,28,1,34,1,34,10,15,4,4,4,4,4,15,15,15,15,4,4,4,28,6,6,6,6,6,15,28,6,6,6,6,6,6,10,10,5,5,5,28,5,5,5,5,6,10,6,2,2,2,2,2,26,10,5,5,10,10,15,2,5,5,10,2,10,2,2,10,2,2,2,5,5,28,15,4,39,4,4,15,10,1,6,1,6,6,26,15,1,10,10,35,10,10,10,15,15,28,15,10,10,10,10,28,15,39,32,3,3,3,3,3,3,10,10,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,6,6,6,6,55,6,28,5,35,6,10,6,37,6,3,10,10,25,10,3,15,3,3,3,3,5,26,15,26,15,28,26,28,28,10,10,10,2,2,2,2,2,2,6,6,10,10,10,26,10,15,2,2,2,2,28,28,6,6,6,6,3,3,3,3,3,15,10,3,3,3,3,28,15,10,2,10,28,4,2,15,47,15,2,54,15,15,2,10,4,2,10,15,3,3,3,3,3,10,10,15,15,28,10,10,10,57,10,10,10,10,10,10,10,10,28,3,3,3,6,2,2,2,2,2,2,28,6,15,15,15,15,28,12,12,12,5,4,4,4,4,15,52,28,6,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,15,3,3,3,15,15,15,15,15,6,6,10,10,10,2,2,2,2,2,2,6,6,6,28,15,15,15,26,10,28,15,15,15,4,4,4,4,10,10,15,5,5,5,15,10,10,10,10,15,39,15,26,15,10,10,28,28,6,15,6,25,6,26,5,5,15,15,28,64,10,22,45,28,10,10,10,2,2,2,2,3,2,3,52,15,39,2,2,2,2,2,15,15,10,28,39,49,2,13,10,10,20,1,48,28,10,10,35,10,41,10,10,10,10,6,28,35,6,6,6,10,10,10,10,10,10,10,10,10,10,5,16,16,5,16,28,39,15,15,39,15,15,15,2,2,2,2,2,28,5,5,5,28,28,10,4,4,4,5,5,5,6,6,4,4,4,5,5,5,1,6,6,6,15,6,4,4,28,28,10,10,15,2,2,2,6,5,15,6,15,46,5,10,10,5,14,7,14,14,4,4,4,3,3,3,3,10,10,28,6,15,59,53,53,52,2,2,2,2,2,6,28,10,28,15,15,5,28,4,4,6,6,10,35,12,12,5,28,15,6,6,15,15,2,2,2,2,10,10,15,15,5,7,5,23,15,28,28,15,14,5,2,2,2,2,2,2,28,4,15,28,4,4,4,4,10,22,22,15,10,2,52,2,5,2,2,2,2,15,53,6,15,2,6,48,15,15,28,2,2,2,15,15,28,48,6,6,15,10,28,15,28,3,3,35,6,15,6,10,10,15,2,28,2,10,2,10,10,10,10,5,5,26,26,10,16,33,16,10,10,10,10,10,2,2,2,2,2,5,10,5,10,4,4,15,15,2,2,15,6,10,10,10,15,10,39,4,28,24,28,19,7,6,6,6,6,15,5,5,5,15,3,3,3,3,26,2,2,2,2,15,3,10,6,6,6,3,3,3,5,6,6,15,5,16,2,2,15,15,15,5,15,15,15,5,5,10,15,10,22,10,28,2,2,2,2,2,2,10,2,2,2,2,2,2,2,10,2,38,5,2,2,6,10,15,22,5,6,15,2,2,2,4,4,3,3,3,2,3,3,6,6,15,6,15,15,4,15,6,10,4,4,6,39,2,6,10,10,15,10,15,15,2,2,2,12,5,4,3,15,10,22,10,5,39,3,3,10,10,2,2,10,10,28,2,2,2,15,10,10,2,25,6,15,6,2,10,6,10,3,15,10,8,2,2,2,11,10,28,3,6,2,2,5]},"nodesToDataframe":true,"edgesToDataframe":true,"options":{"width":"100%","height":"100%","nodes":{"shape":"dot","physics":false,"borderWidth":1,"fixed":true,"shadow":true,"scaling":{"min":5,"max":60}},"manipulation":{"enabled":false},"edges":{"smooth":false},"physics":{"stabilization":false},"groups":{"1":{"color":"#D93C43"},"2":{"color":"#42B841"},"3":{"color":"#4B9BDA"},"4":{"color":"#B5B724"},"5":{"color":"#AF83D8"},"6":{"color":"#39CADC"},"useDefaultGroups":true,"7":{"color":"#E87915"}},"interaction":{"hover":true}},"groups":["1","2","6","5","3","4","7"],"width":1024,"height":768,"idselection":{"enabled":false},"byselection":{"enabled":false},"main":null,"submain":null,"footer":null,"igraphlayout":{"type":"square"},"tooltipStay":300,"tooltipStyle":"position: fixed;visibility:hidden;padding: 5px;white-space: nowrap;font-family: verdana;font-size:14px;font-color:#000000;background-color: #f5f4ed;-moz-border-radius: 3px;-webkit-border-radius: 3px;border-radius: 3px;border: 1px solid #808074;box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);"},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-01d94975dbdb944cbaa3">{"viewer":{"width":1024,"height":768,"padding":15,"fill":false},"browser":{"width":1024,"height":768,"padding":40,"fill":false}}</script>
</body>
</html>
